github.com/sacloud/libsacloud/v2@v2.32.3/internal/define/bill.go (about) 1 // Copyright 2016-2022 The Libsacloud 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 "fmt" 19 "net/http" 20 21 "github.com/sacloud/libsacloud/v2/internal/define/names" 22 "github.com/sacloud/libsacloud/v2/internal/dsl" 23 "github.com/sacloud/libsacloud/v2/internal/dsl/meta" 24 "github.com/sacloud/libsacloud/v2/sacloud/naked" 25 ) 26 27 const ( 28 billAPIName = "Bill" 29 billAPIPathName = "bill" 30 ) 31 32 var billAPI = &dsl.Resource{ 33 Name: billAPIName, 34 PathName: billAPIPathName, 35 PathSuffix: dsl.BillingAPISuffix, // 請求情報向けエンドポイント 36 IsGlobal: true, 37 Operations: dsl.Operations{ 38 // by-contract 39 { 40 ResourceName: billAPIName, 41 Name: "ByContract", 42 PathFormat: billByContractPath, 43 Method: http.MethodGet, 44 UseWrappedResult: true, 45 Arguments: dsl.Arguments{ 46 billArgAccountID, 47 }, 48 ResponseEnvelope: dsl.ResponseEnvelopePlural(&dsl.EnvelopePayloadDesc{ 49 Type: billNakedType, 50 Name: names.ResourceFieldName(billAPIName, dsl.PayloadForms.Plural), 51 }), 52 Results: dsl.Results{ 53 { 54 SourceField: names.ResourceFieldName(billAPIName, dsl.PayloadForms.Plural), 55 DestField: names.ResourceFieldName(billAPIName, dsl.PayloadForms.Plural), 56 IsPlural: true, 57 Model: billView, 58 }, 59 }, 60 }, 61 // by-contract/year 62 { 63 ResourceName: billAPIName, 64 Name: "ByContractYear", 65 PathFormat: billByContractYearPath, 66 Method: http.MethodGet, 67 UseWrappedResult: true, 68 Arguments: dsl.Arguments{ 69 billArgAccountID, 70 billArgYear, 71 }, 72 ResponseEnvelope: dsl.ResponseEnvelopePlural(&dsl.EnvelopePayloadDesc{ 73 Type: billNakedType, 74 Name: names.ResourceFieldName(billAPIName, dsl.PayloadForms.Plural), 75 }), 76 Results: dsl.Results{ 77 { 78 SourceField: names.ResourceFieldName(billAPIName, dsl.PayloadForms.Plural), 79 DestField: names.ResourceFieldName(billAPIName, dsl.PayloadForms.Plural), 80 IsPlural: true, 81 Model: billView, 82 }, 83 }, 84 }, 85 // by-contract/year/month 86 { 87 ResourceName: billAPIName, 88 Name: "ByContractYearMonth", 89 PathFormat: billByContractYearMonthPath, 90 Method: http.MethodGet, 91 UseWrappedResult: true, 92 Arguments: dsl.Arguments{ 93 billArgAccountID, 94 billArgYear, 95 billArgMonth, 96 }, 97 ResponseEnvelope: dsl.ResponseEnvelopePlural(&dsl.EnvelopePayloadDesc{ 98 Type: billNakedType, 99 Name: names.ResourceFieldName(billAPIName, dsl.PayloadForms.Plural), 100 }), 101 Results: dsl.Results{ 102 { 103 SourceField: names.ResourceFieldName(billAPIName, dsl.PayloadForms.Plural), 104 DestField: names.ResourceFieldName(billAPIName, dsl.PayloadForms.Plural), 105 IsPlural: true, 106 Model: billView, 107 }, 108 }, 109 }, 110 // by id(レスポンスは複数形) 111 { 112 ResourceName: billAPIName, 113 Name: "Read", 114 PathFormat: billByIDPath, 115 Method: http.MethodGet, 116 UseWrappedResult: true, 117 Arguments: dsl.Arguments{ 118 dsl.ArgumentID, 119 }, 120 ResponseEnvelope: dsl.ResponseEnvelopePlural(&dsl.EnvelopePayloadDesc{ 121 Type: billNakedType, 122 Name: names.ResourceFieldName(billAPIName, dsl.PayloadForms.Plural), 123 }), 124 Results: dsl.Results{ 125 { 126 SourceField: names.ResourceFieldName(billAPIName, dsl.PayloadForms.Plural), 127 DestField: names.ResourceFieldName(billAPIName, dsl.PayloadForms.Plural), 128 IsPlural: true, 129 Model: billView, 130 }, 131 }, 132 }, 133 // details 134 { 135 ResourceName: billAPIName, 136 Name: "Details", 137 PathFormat: billDetailPath, 138 Method: http.MethodGet, 139 UseWrappedResult: true, 140 Arguments: dsl.Arguments{ 141 billArgMemberCode, 142 dsl.ArgumentID, 143 }, 144 ResponseEnvelope: dsl.ResponseEnvelopePlural(&dsl.EnvelopePayloadDesc{ 145 Type: billDetailNakedType, 146 Name: names.ResourceFieldName(billAPIName+"Detail", dsl.PayloadForms.Plural), 147 }), 148 Results: dsl.Results{ 149 { 150 SourceField: names.ResourceFieldName(billAPIName+"Detail", dsl.PayloadForms.Plural), 151 DestField: names.ResourceFieldName(billAPIName+"Detail", dsl.PayloadForms.Plural), 152 IsPlural: true, 153 Model: billDetailView, 154 }, 155 }, 156 }, 157 // detail csv 158 { 159 ResourceName: billAPIName, 160 Name: "DetailsCSV", 161 PathFormat: billDetailPath + "/csv", 162 Method: http.MethodGet, 163 Arguments: dsl.Arguments{ 164 billArgMemberCode, 165 dsl.ArgumentID, 166 }, 167 ResponseEnvelope: dsl.ResponseEnvelope(&dsl.EnvelopePayloadDesc{ 168 Type: billDetailCSVNakedType, 169 Name: "CSV", 170 }), 171 Results: dsl.Results{ 172 { 173 SourceField: "CSV", 174 DestField: billDetailCSVView.Name, 175 IsPlural: false, 176 Model: billDetailCSVView, 177 }, 178 }, 179 }, 180 }, 181 } 182 183 var ( 184 billArgAccountID = &dsl.Argument{ 185 Name: "accountID", 186 Type: meta.TypeID, 187 } 188 billArgYear = &dsl.Argument{ 189 Name: "year", 190 Type: meta.TypeInt, 191 } 192 billArgMonth = &dsl.Argument{ 193 Name: "month", 194 Type: meta.TypeInt, 195 } 196 billArgMemberCode = &dsl.Argument{ 197 Name: "MemberCode", 198 Type: meta.TypeString, 199 } 200 201 billByContractPath = fmt.Sprintf("{{.rootURL}}/{{.zone}}/{{.pathSuffix}}/{{.pathName}}/by-contract/{{.%s}}", billArgAccountID.ArgName()) 202 billByContractYearPath = fmt.Sprintf("%s/{{.%s}}", billByContractPath, billArgYear.ArgName()) 203 billByContractYearMonthPath = fmt.Sprintf("%s/{{.%s}}", billByContractYearPath, billArgMonth.ArgName()) 204 billByIDPath = fmt.Sprintf("{{.rootURL}}/{{.zone}}/{{.pathSuffix}}/{{.pathName}}/id/{{.%s}}", dsl.ArgumentID.ArgName()) 205 206 billDetailPath = fmt.Sprintf( 207 "{{.rootURL}}/{{.zone}}/{{.pathSuffix}}/{{.pathName}}detail/{{.%s}}/{{.%s}}", 208 billArgMemberCode.ArgName(), 209 dsl.ArgumentID.ArgName(), 210 ) 211 ) 212 213 var ( 214 billNakedType = meta.Static(naked.Bill{}) 215 billView = &dsl.Model{ 216 Name: billAPIName, 217 NakedType: billNakedType, 218 Fields: []*dsl.FieldDesc{ 219 fields.ID(), 220 billFields.Amount(), 221 billFields.Date(), 222 billFields.MemberID(), 223 billFields.Paid(), 224 billFields.PayLimit(), 225 billFields.PaymentClassID(), 226 }, 227 } 228 229 billDetailNakedType = meta.Static(naked.BillDetail{}) 230 billDetailView = &dsl.Model{ 231 Name: billAPIName + "Detail", 232 NakedType: billDetailNakedType, 233 Fields: []*dsl.FieldDesc{ 234 fields.ID(), 235 billFields.Amount(), 236 fields.Description(), 237 billFields.ServiceClassID(), 238 billFields.ServiceClassPath(), 239 billFields.Usage(), 240 billFields.FormattedUsage(), 241 billFields.ServiceUsagePath(), 242 billFields.Zone(), 243 billFields.ContractEndAt(), 244 }, 245 } 246 247 billDetailCSVNakedType = meta.Static(naked.BillDetailCSV{}) 248 billDetailCSVView = &dsl.Model{ 249 Name: billAPIName + "DetailCSV", 250 NakedType: billDetailCSVNakedType, 251 Fields: []*dsl.FieldDesc{ 252 fields.Def("Count", meta.TypeInt), 253 fields.Def("ResponsedAt", meta.TypeTime), 254 fields.Def("Filename", meta.TypeString), 255 fields.Def("RawBody", meta.TypeString), 256 fields.Def("HeaderRow", meta.TypeStringSlice), 257 fields.Def("BodyRows", meta.Static([][]string{})), 258 }, 259 } 260 ) 261 262 type billFieldsDef struct{} 263 264 var billFields = &billFieldsDef{} 265 266 func (f *billFieldsDef) Amount() *dsl.FieldDesc { 267 return &dsl.FieldDesc{ 268 Name: "Amount", 269 Type: meta.TypeInt64, 270 } 271 } 272 273 func (f *billFieldsDef) BillID() *dsl.FieldDesc { 274 return &dsl.FieldDesc{ 275 Name: "ID", 276 Type: meta.TypeID, 277 } 278 } 279 280 func (f *billFieldsDef) Date() *dsl.FieldDesc { 281 return &dsl.FieldDesc{ 282 Name: "Date", 283 Type: meta.TypeTime, 284 } 285 } 286 287 func (f *billFieldsDef) MemberID() *dsl.FieldDesc { 288 return &dsl.FieldDesc{ 289 Name: "MemberID", 290 Type: meta.TypeString, 291 } 292 } 293 294 func (f *billFieldsDef) Paid() *dsl.FieldDesc { 295 return &dsl.FieldDesc{ 296 Name: "Paid", 297 Type: meta.TypeFlag, 298 } 299 } 300 301 func (f *billFieldsDef) PayLimit() *dsl.FieldDesc { 302 return &dsl.FieldDesc{ 303 Name: "PayLimit", 304 Type: meta.TypeTime, 305 } 306 } 307 308 func (f *billFieldsDef) PaymentClassID() *dsl.FieldDesc { 309 return &dsl.FieldDesc{ 310 Name: "PaymentClassID", 311 Type: meta.TypeID, 312 } 313 } 314 315 func (f *billFieldsDef) ServiceClassID() *dsl.FieldDesc { 316 return &dsl.FieldDesc{ 317 Name: "ServiceClassID", 318 Type: meta.TypeID, 319 } 320 } 321 322 func (f *billFieldsDef) ServiceClassPath() *dsl.FieldDesc { 323 return &dsl.FieldDesc{ 324 Name: "ServiceClassPath", 325 Type: meta.TypeString, 326 } 327 } 328 329 func (f *billFieldsDef) Usage() *dsl.FieldDesc { 330 return &dsl.FieldDesc{ 331 Name: "Usage", 332 Type: meta.TypeInt64, 333 } 334 } 335 336 func (f *billFieldsDef) FormattedUsage() *dsl.FieldDesc { 337 return &dsl.FieldDesc{ 338 Name: "FormattedUsage", 339 Type: meta.TypeString, 340 } 341 } 342 343 func (f *billFieldsDef) ServiceUsagePath() *dsl.FieldDesc { 344 return &dsl.FieldDesc{ 345 Name: "ServiceUsagePath", 346 Type: meta.TypeString, 347 } 348 } 349 350 func (f *billFieldsDef) Zone() *dsl.FieldDesc { 351 return &dsl.FieldDesc{ 352 Name: "Zone", 353 Type: meta.TypeString, 354 } 355 } 356 357 func (f *billFieldsDef) ContractEndAt() *dsl.FieldDesc { 358 return &dsl.FieldDesc{ 359 Name: "ContractEndAt", 360 Type: meta.TypeTime, 361 } 362 }