github.com/sacloud/iaas-api-go@v1.12.0/internal/define/esme.go (about)

     1  // Copyright 2022-2023 The sacloud/iaas-api-go Authors
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package define
    16  
    17  import (
    18  	"net/http"
    19  
    20  	"github.com/sacloud/iaas-api-go/internal/define/names"
    21  	"github.com/sacloud/iaas-api-go/internal/define/ops"
    22  	"github.com/sacloud/iaas-api-go/internal/dsl"
    23  	"github.com/sacloud/iaas-api-go/internal/dsl/meta"
    24  	"github.com/sacloud/iaas-api-go/naked"
    25  	"github.com/sacloud/iaas-api-go/types"
    26  )
    27  
    28  const (
    29  	esmeAPIName     = "ESME"
    30  	esmeAPIPathName = "commonserviceitem"
    31  )
    32  
    33  var esmeAPI = &dsl.Resource{
    34  	Name:       esmeAPIName,
    35  	PathName:   esmeAPIPathName,
    36  	PathSuffix: dsl.CloudAPISuffix,
    37  	IsGlobal:   true,
    38  	Operations: dsl.Operations{
    39  		// find
    40  		ops.FindCommonServiceItem(esmeAPIName, esmeNakedType, findParameter, esmeView),
    41  
    42  		// create
    43  		ops.CreateCommonServiceItem(esmeAPIName, esmeNakedType, esmeCreateParam, esmeView),
    44  
    45  		// read
    46  		ops.ReadCommonServiceItem(esmeAPIName, esmeNakedType, esmeView),
    47  
    48  		// update
    49  		ops.UpdateCommonServiceItem(esmeAPIName, esmeNakedType, esmeUpdateParam, esmeView),
    50  
    51  		// delete
    52  		ops.Delete(esmeAPIName),
    53  
    54  		// SendMessageWithGeneratedOTP
    55  		{
    56  			ResourceName: esmeAPIName,
    57  			Name:         "SendMessageWithGeneratedOTP",
    58  			PathFormat:   dsl.IDAndSuffixPathFormat("esme/2fa/otp"),
    59  			Method:       http.MethodPut,
    60  			RequestEnvelope: dsl.RequestEnvelope(&dsl.EnvelopePayloadDesc{
    61  				Type: meta.Static(naked.ESMESendSMSRequest{}),
    62  				Name: esmeAPIName,
    63  			}),
    64  			Arguments: dsl.Arguments{
    65  				dsl.ArgumentID,
    66  				dsl.MappableArgument("param", esmeSendMessageWithGeneratedOTPParam, "ESME"),
    67  			},
    68  			ResponseEnvelope: dsl.ResponseEnvelope(&dsl.EnvelopePayloadDesc{
    69  				Type: meta.Static(naked.ESMESendSMSResponse{}),
    70  				Name: esmeAPIName,
    71  			}),
    72  			Results: dsl.Results{
    73  				{
    74  					SourceField: esmeAPIName,
    75  					DestField:   esmeSendMessageResult.Name,
    76  					Model:       esmeSendMessageResult,
    77  				},
    78  			},
    79  		},
    80  
    81  		// SendMessageWithInputtedOTP
    82  		{
    83  			ResourceName: esmeAPIName,
    84  			Name:         "SendMessageWithInputtedOTP",
    85  			PathFormat:   dsl.IDAndSuffixPathFormat("esme/2fa"),
    86  			Method:       http.MethodPut,
    87  			RequestEnvelope: dsl.RequestEnvelope(&dsl.EnvelopePayloadDesc{
    88  				Type: meta.Static(naked.ESMESendSMSRequest{}),
    89  				Name: esmeAPIName,
    90  			}),
    91  			Arguments: dsl.Arguments{
    92  				dsl.ArgumentID,
    93  				dsl.MappableArgument("param", esmeSendMessageWithInputtedOTPParam, "ESME"),
    94  			},
    95  			ResponseEnvelope: dsl.ResponseEnvelope(&dsl.EnvelopePayloadDesc{
    96  				Type: meta.Static(naked.ESMESendSMSResponse{}),
    97  				Name: esmeAPIName,
    98  			}),
    99  			Results: dsl.Results{
   100  				{
   101  					SourceField: esmeAPIName,
   102  					DestField:   esmeSendMessageResult.Name,
   103  					Model:       esmeSendMessageResult,
   104  				},
   105  			},
   106  		},
   107  
   108  		// Logs
   109  		{
   110  			ResourceName: esmeAPIName,
   111  			Name:         "Logs",
   112  			PathFormat:   dsl.IDAndSuffixPathFormat("esme/logs"),
   113  			Method:       http.MethodGet,
   114  			Arguments: dsl.Arguments{
   115  				dsl.ArgumentID,
   116  			},
   117  			ResponseEnvelope: dsl.ResponseEnvelope(&dsl.EnvelopePayloadDesc{
   118  				Name: "ESME",
   119  				Type: meta.Static(&naked.ESMELogs{}),
   120  			}),
   121  			Results: dsl.Results{
   122  				{
   123  					SourceField: "ESME.Logs",
   124  					DestField:   "Logs",
   125  					IsPlural:    true,
   126  					Model:       esmeLogsModel,
   127  				},
   128  			},
   129  		},
   130  	},
   131  }
   132  
   133  var (
   134  	esmeNakedType = meta.Static(naked.ESME{})
   135  
   136  	esmeView = &dsl.Model{
   137  		Name:      esmeAPIName,
   138  		NakedType: esmeNakedType,
   139  		Fields: []*dsl.FieldDesc{
   140  			fields.ID(),
   141  			fields.Name(),
   142  			fields.Description(),
   143  			fields.Tags(),
   144  			fields.Availability(),
   145  			fields.IconID(),
   146  			fields.CreatedAt(),
   147  			fields.ModifiedAt(),
   148  		},
   149  	}
   150  
   151  	esmeCreateParam = &dsl.Model{
   152  		Name:      names.CreateParameterName(esmeAPIName),
   153  		NakedType: esmeNakedType,
   154  		ConstFields: []*dsl.ConstFieldDesc{
   155  			{
   156  				Name: "Class",
   157  				Type: meta.TypeString,
   158  				Tags: &dsl.FieldTags{
   159  					MapConv: "Provider.Class",
   160  				},
   161  				Value: `"esme"`,
   162  			},
   163  		},
   164  
   165  		Fields: []*dsl.FieldDesc{
   166  			// common fields
   167  			fields.Name(),
   168  			fields.Description(),
   169  			fields.Tags(),
   170  			fields.IconID(),
   171  		},
   172  	}
   173  
   174  	esmeUpdateParam = &dsl.Model{
   175  		Name:      names.UpdateParameterName(esmeAPIName),
   176  		NakedType: esmeNakedType,
   177  		Fields: []*dsl.FieldDesc{
   178  			// common fields
   179  			fields.Name(),
   180  			fields.Description(),
   181  			fields.Tags(),
   182  			fields.IconID(),
   183  		},
   184  	}
   185  
   186  	esmeSendMessageWithGeneratedOTPParam = &dsl.Model{
   187  		Name:      "ESMESendMessageWithGeneratedOTPRequest",
   188  		NakedType: meta.Static(naked.ESMESendSMSRequest{}),
   189  		ConstFields: []*dsl.ConstFieldDesc{
   190  			{
   191  				Name:  "OTPOperation",
   192  				Type:  meta.Static(types.EOTPOperation("")),
   193  				Value: `"` + types.OTPOperations.Generate.String() + `"`,
   194  			},
   195  		},
   196  		Fields: []*dsl.FieldDesc{
   197  			// common fields
   198  			fields.Def("Destination", meta.TypeString), // 宛先 81開始
   199  			fields.Def("Sender", meta.TypeString),
   200  			fields.Def("DomainName", meta.TypeString),
   201  		},
   202  	}
   203  
   204  	esmeSendMessageWithInputtedOTPParam = &dsl.Model{
   205  		Name:      "ESMESendMessageWithInputtedOTPRequest",
   206  		NakedType: meta.Static(naked.ESMESendSMSRequest{}),
   207  		ConstFields: []*dsl.ConstFieldDesc{
   208  			{
   209  				Name:  "OTPOperation",
   210  				Type:  meta.Static(types.EOTPOperation("")),
   211  				Value: `"` + types.OTPOperations.Input.String() + `"`,
   212  			},
   213  		},
   214  		Fields: []*dsl.FieldDesc{
   215  			// common fields
   216  			fields.Def("Destination", meta.TypeString), // 宛先 81開始
   217  			fields.Def("Sender", meta.TypeString),
   218  			fields.Def("DomainName", meta.TypeString),
   219  			fields.Def("OTP", meta.TypeString),
   220  		},
   221  	}
   222  
   223  	esmeSendMessageResult = &dsl.Model{
   224  		Name:      "ESMESendMessageResult",
   225  		NakedType: meta.Static(naked.ESMESendSMSResponse{}),
   226  		Fields: []*dsl.FieldDesc{
   227  			// common fields
   228  			fields.Def("MessageID", meta.TypeString),
   229  			fields.Def("Status", meta.TypeString), // TODO typesに型定義したいが不明な値があるためstringとしている
   230  			fields.Def("OTP", meta.TypeString),
   231  		},
   232  	}
   233  
   234  	esmeLogsModel = &dsl.Model{
   235  		Name:      esmeAPIName + "Logs",
   236  		NakedType: meta.Static(naked.ESMELog{}),
   237  		IsArray:   true,
   238  		Fields: []*dsl.FieldDesc{
   239  			fields.Def("MessageID", meta.TypeString),
   240  			fields.Def("Status", meta.TypeString), // TODO typesに型定義したいが不明な値があるためstringとしている
   241  			fields.Def("OTP", meta.TypeString),
   242  			fields.Def("Destination", meta.TypeString),
   243  			fields.Def("SentAt", meta.TypeTime),
   244  			fields.Def("DoneAt", meta.TypeTime),
   245  			fields.Def("RetryCount", meta.TypeInt),
   246  		},
   247  	}
   248  )