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  }