SDKを使用した各メータリングAPIの実装サンプルとメータリングAPIを利用した機能の一例を記載します。
それぞれのAPIの詳細はAPIドキュメントをご確認ください。
実装サンプル
指定した日付のメータリングユニットカウントを取得
APIドキュメントユースケース
テナント向けに使用量を見せたい場合などに使用してください。
実装サンプル
- PHP
- Go
- Python
- Java
- C#(.Net8)
- C#(.Netfw4.8)
/**
* 指定した日付のメータリングユニットカウントを取得
*
* @param string $tenantId テナントID
* @param string $meteringUnitName メータリングユニット名
* @param string $date 日付 yyyy-mm-dd形式
* @return array
*/
public function getCountOfSpecifiedDate(string $tenantId, string $meteringUnitName, string $date)
{
$client = new \AntiPatternInc\Saasus\Api\Client();
$pricingApi = $client->getPricingClient();
$unitCount = $pricingApi->getMeteringUnitDateCountByTenantIdAndUnitNameAndDate(
$tenantId,
$meteringUnitName,
$date
);
return [
'count' => $unitCount->getCount(),
'date' => $unitCount->getDate(),
'meteringUnitName' => $unitCount->getMeteringUnitName(),
];
}
// 指定した日付のメータリングユニットカウントを取得
// tenantId: テナントID
// unit: メータリングユニット名
// date: yyyy-MM-dd形式の日付
// returns: {"count": int, "date": string, "meteringUnitName": string}
func getCountOfSpecifiedDate(c echo.Context) error {
tenantId := c.Param("tenantId")
unit := c.Param("unit")
date := c.Param("date")
resp, err := pricingClient.
GetMeteringUnitDateCountByTenantIdAndUnitNameAndDateWithResponse(
c.Request().Context(), tenantId, unit, date,
)
if err != nil || resp.JSON200 == nil {
return c.String(http.StatusInternalServerError, "pricing API error")
}
return c.JSON(http.StatusOK, echo.Map{
"count": resp.JSON200.Count,
"date": resp.JSON200.Date,
"meteringUnitName": resp.JSON200.MeteringUnitName,
})
}
# 指定した日付のメータリングユニットカウントを取得
# tenant_id: テナントID
# unit: メータリングユニット名
# date: yyyy-MM-dd形式の日付
# returns: {"count": int, "date": str, "meteringUnitName": str}
def get_count_of_specified_date(tenant_id: str, unit: str, date: str) -> Dict:
metering_api = MeteringApi(api_client=pricing_api_client)
cnt = metering_api.get_metering_unit_date_count_by_tenant_id_and_unit_name_and_date(
tenant_id=tenant_id,
metering_unit_name=unit,
var_date=date,
)
return {
"count": cnt.count,
"date": cnt.var_date,
"meteringUnitName": cnt.metering_unit_name,
}
// 指定した日付のメータリングユニットカウントを取得
// tenantId: テナントID
// unit: メータリングユニット名
// date: yyyy-MM-dd形式の日付
@GetMapping("/tenants/{tenant_id}/metering/{unit:^(?!date$|month$).+}/date/{date}/count")
public ResponseEntity<?> getUnitDateCount(
HttpServletRequest request,
@PathVariable("tenant_id") String tenantId,
@PathVariable String unit,
@PathVariable String date
) {
try {
PricingApiClient pricingClient = new Configuration().getPricingApiClient();
pricingClient.setReferer(request.getHeader("X-Saasus-Referer"));
MeteringApi meteringApi = new MeteringApi(pricingClient);
MeteringUnitDateCount cnt = meteringApi
.getMeteringUnitDateCountByTenantIdAndUnitNameAndDate(tenantId, unit, date);
Map<String, Object> resp = new HashMap<>();
resp.put("count", cnt.getCount());
resp.put("date", cnt.getDate());
resp.put("meteringUnitName", cnt.getMeteringUnitName());
return ResponseEntity.ok(resp);
} catch (saasus.sdk.pricing.ApiException e) {
throw new ResponseStatusException(
HttpStatus.INTERNAL_SERVER_ERROR,
"Pricing API error: " + e.getMessage(), e
);
}
}
/// <summary>指定した日付のメータリングユニットカウントを取得</summary>
/// <param name="context">HTTP コンテキスト</param>
/// <param name="tenant_id">テナントID</param>
/// <param name="unit">メータリングユニット名</param>
/// <param name="date">日付 (yyyy-MM-dd)</param>
/// <returns>JSON { count:int, date:string, meteringUnitName:string }</returns>
app.MapGet("/tenants/{tenant_id}/metering/{unit}/date/{date}/count",
async (HttpContext context, string tenant_id, string unit, string date) =>
{
try
{
var cfg = CreateClientConfiguration(c => c.GetPricingApiClientConfig(), context);
var metering = new MeteringApi(cfg);
var cnt = await metering.GetMeteringUnitDateCountByTenantIdAndUnitNameAndDateAsync(
tenant_id, unit, date);
return Results.Json(new {
count = cnt.Count,
date = cnt.Date,
meteringUnitName = cnt.MeteringUnitName
});
}
catch (Exception ex) { return HandleApiException(ex); }
});
/// <summary>
/// 指定した日付のメータリングユニットカウントを取得
/// </summary>
/// <param name="tenant_id">テナントID</param>
/// <param name="unit">メータリングユニット名</param>
/// <param name="date">日付 (yyyy-MM-dd)</param>
/// <returns>JSON { count:int, date:string, meteringUnitName:string }</returns>
[HttpGet]
[Route("tenants/{tenant_id}/metering/{unit}/date/{date}/count")]
public async Task<IHttpActionResult> GetUnitDateCount(
string tenant_id,
string unit,
string date)
{
try
{
var cfg = CreateClientConfiguration(c => c.GetPricingApiClientConfig());
var metering = new MeteringApi(cfg);
var cnt = await metering.GetMeteringUnitDateCountByTenantIdAndUnitNameAndDateAsync(
tenant_id, unit, date);
return Ok(new
{
count = cnt.Count,
date = cnt.Date,
meteringUnitName = cnt.MeteringUnitName
});
}
catch (Exception ex) { return HandleApiException(ex); }
}
指定したタイムスタンプのメータリングユニットカウントを更新
APIドキュメントユースケース
過去のデータで使用量の更新ミスがあった場合に調整する場合などに使用してください。
実装サンプル
- PHP
- Go
- Python
- Java
- C#(.Net8)
- C#(.Netfw4.8)
/**
* 指定したタイムスタンプのメータリングユニットカウントを更新
*
* @param string $tenantId テナントID
* @param string $meteringUnitName メータリングユニット名
* @param int $timestamp タイムスタンプ 秒までのタイムスタンプ
* @param Request $request
* @return array
*/
public function updateCountOfSpecifiedTimestamp(string $tenantId, string $meteringUnitName, int $timestamp, Request $request)
{
// リクエストから更新方法と件数を取得
['method' => $method, 'count' => $count] = $request->only(['method', 'count']);
$updateMeteringUnitTimeStampParam = new UpdateMeteringUnitTimestampCountParam();
$updateMeteringUnitTimeStampParam->setMethod($method)
->setCount($count);
$unitCount = $this->saasusClient->getPricingClient()->updateMeteringUnitTimestampCount(
$tenantId, $meteringUnitName, $timestamp,
$updateMeteringUnitTimeStampParam
);
return [
'count' => $unitCount->getCount(),
'timestamp' => $unitCount->getTimestamp(),
'meteringUnitName' => $unitCount->getMeteringUnitName(),
];
}
// 指定したタイムスタンプのメータリングユニットカウントを 更新
// tenantId: テナントID
// unit: メータリングユニット名
// ts: 秒までのタイムスタンプ
// body: {"method": "add|sub|direct", "count": int}
// returns: {"count": int, "timestamp": int, "meteringUnitName": string}
func updateCountOfSpecifiedTS(c echo.Context) error {
tenantId := c.Param("tenantId")
unit := c.Param("unit")
ts, err := strconv.ParseInt(c.Param("ts"), 10, 64)
if err != nil {
return c.String(http.StatusBadRequest, "timestamp must be int")
}
var body struct {
Method string `json:"method"` // add | sub | direct
Count int `json:"count"`
}
if err := c.Bind(&body); err != nil {
return c.String(http.StatusBadRequest, "invalid body")
}
method := pricingapi.UpdateMeteringUnitTimestampCountMethod(body.Method)
switch method {
case pricingapi.Add, pricingapi.Sub, pricingapi.Direct:
default:
return c.String(http.StatusBadRequest, "method must be add/sub/direct")
}
param := pricingapi.UpdateMeteringUnitTimestampCountParam{Method: method, Count: body.Count}
resp, err := pricingClient.
UpdateMeteringUnitTimestampCountWithResponse(
c.Request().Context(), tenantId, unit, int(ts), param)
if err != nil || resp.JSON200 == nil {
return c.String(http.StatusInternalServerError, "pricing API error")
}
return c.JSON(http.StatusOK, resp.JSON200)
}
# 指定したタイムスタンプのメータリングユニットカウントを更新
# tenant_id: テナントID
# unit: メータリングユニット名
# ts: timestamp (秒)
# req: UpdateCountRequest(method="add|sub|direct", count=int)
# returns: UpdateMeteringUnitTimestampCountParam response model
def update_count_of_specified_ts(tenant_id: str, unit: str, ts: int, req: UpdateCountRequest):
metering_api = MeteringApi(api_client=pricing_api_client)
param = UpdateMeteringUnitTimestampCountParam(
method=UpdateMeteringUnitTimestampCountMethod(req.method),
count=req.count,
)
return metering_api.update_metering_unit_timestamp_count(
tenant_id=tenant_id,
metering_unit_name=unit,
timestamp=ts,
update_metering_unit_timestamp_count_param=param,
)
// 指定したタイムスタンプのメータリングユニットカウントを更新
// tenantId: テナントID
// unit: メータリングユニット名
// ts: タイムスタンプ(秒)
// body: {"method":"add|sub|direct","count":int}
@PutMapping("/tenants/{tenant_id}/metering/{unit}/timestamp/{ts}/count")
public ResponseEntity<?> updateUnitTimestampCount(
HttpServletRequest request,
@PathVariable("tenant_id") String tenantId,
@PathVariable String unit,
@PathVariable long ts,
@RequestBody Map<String,Object> body
) {
String method = (String) body.get("method");
Object cntVal = body.get("count");
if (!Arrays.asList("add","sub","direct").contains(method) || !(cntVal instanceof Number)) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST,
"request body must include method(add/sub/direct) & count(int)");
}
try {
PricingApiClient pricingClient = new Configuration().getPricingApiClient();
pricingClient.setReferer(request.getHeader("X-Saasus-Referer"));
MeteringApi meteringApi = new MeteringApi(pricingClient);
UpdateMeteringUnitTimestampCountParam param = new UpdateMeteringUnitTimestampCountParam()
.method(UpdateMeteringUnitTimestampCountMethod.fromValue(method))
.count(((Number)cntVal).intValue());
MeteringUnitTimestampCount res = meteringApi
.updateMeteringUnitTimestampCount(tenantId, unit, (int) ts, param);
return ResponseEntity.ok(res.toJson());
} catch (saasus.sdk.pricing.ApiException e) {
throw new ResponseStatusException(
HttpStatus.INTERNAL_SERVER_ERROR,
"Pricing API error: " + e.getMessage(), e
);
}
}
/// <summary>タイムスタンプ指定でユニットカウントを更新</summary>
/// <param name="context">HTTP コンテキスト</param>
/// <param name="tenant_id">テナントID</param>
/// <param name="unit">メータリングユニット名</param>
/// <param name="ts">タイムスタンプ (秒)</param>
/// <param name="body">{"method":"add|sub|direct","count":int}</param>
/// <returns>更新後の MeteringUnitTimestampCount オブジェクト</returns>
app.MapPut("/tenants/{tenant_id}/metering/{unit}/timestamp/{ts}/count",
async (HttpContext context, string tenant_id, string unit, int ts, JsonElement body) =>
{
try
{
var method = body.GetProperty("method").GetString()!;
var count = body.GetProperty("count").GetInt32();
if (!new[] { "add", "sub", "direct" }.Contains(method))
return Results.BadRequest("method は add|sub|direct のいずれか。");
var cfg = CreateClientConfiguration(c => c.GetPricingApiClientConfig(), context);
var metering = new MeteringApi(cfg);
var param = new UpdateMeteringUnitTimestampCountParam(
method: Enum.Parse<UpdateMeteringUnitTimestampCountMethod>(method, true),
count: count
);
var res = await metering.UpdateMeteringUnitTimestampCountAsync(
tenant_id, unit, ts, param);
return Results.Json(res);
}
catch (Exception ex) { return HandleApiException(ex); }
});
/// <summary>
/// タイムスタンプ指定でユニットカウントを更新
/// </summary>
/// <param name="tenant_id">テナントID</param>
/// <param name="unit">メータリングユニット名</param>
/// <param name="ts">タイムスタンプ (秒)</param>
/// <param name="body">{"method":"add|sub|direct","count":int}</param>
/// <returns>更新後の MeteringUnitTimestampCount オブジェクト</returns>
[HttpPut]
[Route("tenants/{tenant_id}/metering/{unit}/timestamp/{ts}/count")]
public async Task<IHttpActionResult> UpdateUnitTimestampCount(
string tenant_id,
string unit,
int ts,
[FromBody] UpdateRequestBody body)
{
if (body == null || !new[] { "add", "sub", "direct" }.Contains(body.method))
return BadRequest("body must include method(add/sub/direct) & count(int)");
try
{
var cfg = CreateClientConfiguration(c => c.GetPricingApiClientConfig());
var metering = new MeteringApi(cfg);
var param = new UpdateMeteringUnitTimestampCountParam(
method: (UpdateMeteringUnitTimestampCountMethod)Enum.Parse(
typeof(UpdateMeteringUnitTimestampCountMethod), body.method, true),
count: body.count
);
var res = await metering.UpdateMeteringUnitTimestampCountAsync(
tenant_id, unit, ts, param);
return Ok(res);
}
catch (Exception ex) { return HandleApiException(ex); }
}
指定したタイムスタンプのメータリングユニットカウントを削除
APIドキュメントユースケース
過去のデータで使用量の更新ミスがあった場合に調整する場合などに使用してください。
実装サンプル
- PHP
- Go
- Python
- Java
- C#(.Net8)
- C#(.Netfw4.8)
/**
* 指定したタイムスタンプのメータリングユニットカウントを削除
*
* @param string $tenantId テナントID
* @param string $meteringUnitName メータリングユニット名
* @param int $timestamp タイムスタンプ 秒までのタイムスタンプ
* @return array
*/
public function deleteCountOfSpecifiedTimestamp(string $tenantId, string $meteringUnitName, int $timestamp)
{
$client = new \AntiPatternInc\Saasus\Api\Client();
$pricingApi = $client->getPricingClient();
$pricingApi->deleteMeteringUnitTimestampCount(
$tenantId, $meteringUnitName, $timestamp
);
return ['status' => 'success'];
}
// 指定したタイムスタンプのメータリングユニットカウントを削除
// tenantId: テナントID
// unit: メータリングユニット名
// ts: 秒までのタイムスタンプ
// returns: {"status":"success"}
func deleteCountOfSpecifiedTS(c echo.Context) error {
tenantId := c.Param("tenantId")
unit := c.Param("unit")
ts, err := strconv.ParseInt(c.Param("ts"), 10, 64)
if err != nil {
return c.String(http.StatusBadRequest, "timestamp must be int")
}
_, err = pricingClient.
DeleteMeteringUnitTimestampCountWithResponse(
c.Request().Context(), tenantId, unit, int(ts))
if err != nil {
return c.String(http.StatusInternalServerError, "pricing API error")
}
return c.JSON(http.StatusOK, echo.Map{"status": "success"})
}