{
  "repo": "tidbcloud/cost-metering-service",
  "binary": "server",
  "binary_path": "cmd/server/main.go",
  "dependencies": {
    "HTTP POST /api/v1/cost/measures": {
      "infrastructure": {
        "mysql": {
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "SELECT",
              "trigger": "Check if measure with cost_id exists",
              "conditions": ["Always"],
              "implementation": "entity.NewMeasureQuerySet(db.GetDB()).CostIDEq(input.CostID).One(&ret)"
            },
            {
              "operation": "SELECT",
              "trigger": "Get unit info by unit key",
              "conditions": ["Always"],
              "implementation": "(&UnitModel{}).GetUnit(input.Unit)"
            },
            {
              "operation": "INSERT",
              "trigger": "Insert new measure record",
              "conditions": ["Always"],
              "implementation": "costEntity.Create(db.GetDB().Clauses(clause.Insert{Modifier: \"IGNORE\"}))"
            }
          ]
        }
      },
      "services": []
    },
    "HTTP GET /api/v1/cost/tenants/:tenant_id/cost/test": {
      "infrastructure": {},
      "services": []
    },
    "HTTP GET /api/v1/cost/units": {
      "infrastructure": {
        "mysql": {
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "SELECT",
              "trigger": "Fetch all units from database",
              "conditions": ["Always"],
              "implementation": "entity.NewUnitQuerySet(db.GetDB()).All(&units)"
            }
          ]
        }
      },
      "services": []
    },
    "HTTP POST /api/v1/cost/units": {
      "infrastructure": {
        "mysql": {
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "SELECT",
              "trigger": "Check if unit exists",
              "conditions": ["Always"],
              "implementation": "entity.NewUnitQuerySet(db.GetDB()).UnitKeyEq(unitInfo.UnitKey).One(unitFromDb)"
            },
            {
              "operation": "INSERT",
              "trigger": "Create new unit",
              "conditions": ["Unit does not exist"],
              "implementation": "unit.Create(db.GetDB())"
            },
            {
              "operation": "UPDATE",
              "trigger": "Update existing unit",
              "conditions": ["Unit exists"],
              "implementation": "db.GetDB().Model(unitFromDb).Where(\"unit_key\", unitFromDb.UnitKey).Updates(unit)"
            }
          ]
        }
      },
      "services": []
    },
    "HTTP GET /api/v1/cost/units/:unit_key": {
      "infrastructure": {
        "mysql": {
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "SELECT",
              "trigger": "Fetch unit by unit_key",
              "conditions": ["Always"],
              "implementation": "entity.NewUnitQuerySet(db.GetDB()).UnitKeyEq(unitKey).One(unit)"
            }
          ]
        }
      },
      "services": []
    },
    "HTTP PUT /api/v1/cost/units/:unit_key": {
      "infrastructure": {
        "mysql": {
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "SELECT",
              "trigger": "Check if unit exists",
              "conditions": ["Always"],
              "implementation": "model.GetUnit(unit.UnitKey)"
            },
            {
              "operation": "INSERT",
              "trigger": "Create new unit if not exists",
              "conditions": ["Unit does not exist"],
              "implementation": "unit.Create(db.GetDB())"
            },
            {
              "operation": "UPDATE",
              "trigger": "Update existing unit fields",
              "conditions": ["Unit exists"],
              "implementation": "db.GetDB().Model(unitFromDb).Where(\"unit_key\", unitFromDb.UnitKey).Updates(unit)"
            }
          ]
        }
      },
      "services": []
    },
    "HTTP DELETE /api/v1/cost/units/:unit_key": {
      "infrastructure": {
        "mysql": {
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "DELETE",
              "trigger": "Delete unit by unit_key",
              "conditions": ["Always"],
              "implementation": "entity.NewUnitQuerySet(db.GetDB()).UnitKeyEq(unitKey).Delete()"
            }
          ]
        }
      },
      "services": []
    },
    "Runtime SQSMeasureConsumer.processMessages": {
      "infrastructure": {
        "mysql": {
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "SELECT",
              "trigger": "Check if measure exists",
              "conditions": ["Always"],
              "implementation": "entity.NewMeasureQuerySet(db.GetDB()).CostIDEq(input.CostID).One(&ret)"
            },
            {
              "operation": "SELECT",
              "trigger": "Get unit info",
              "conditions": ["Always"],
              "implementation": "(&UnitModel{}).GetUnit(input.Unit)"
            },
            {
              "operation": "INSERT",
              "trigger": "Insert measure record",
              "conditions": ["Always"],
              "implementation": "costEntity.Create(db.GetDB().Clauses(clause.Insert{Modifier: \"IGNORE\"}))"
            }
          ]
        },
        "aws_sqs": {
          "conditions": ["config.EnableQueueMeasure == true"],
          "operations": [
            {
              "operation": "RECEIVE",
              "trigger": "Receive messages from SQS queue",
              "conditions": ["config.EnableQueueMeasure == true"],
              "implementation": "sqsClient.ReceiveMessage(&sqs.ReceiveMessageInput{QueueUrl: queueURL, MaxNumberOfMessages: 10, WaitTimeSeconds: 20})"
            },
            {
              "operation": "DELETE",
              "trigger": "Delete processed messages",
              "conditions": ["Message processed successfully"],
              "implementation": "sqsClient.DeleteMessageBatch(&sqs.DeleteMessageBatchInput{QueueUrl: queueURL, Entries: deleteData})"
            }
          ]
        }
      },
      "services": []
    },
    "Runtime SQSDLMeasureConsumer.processMessages": {
      "infrastructure": {
        "mysql": {
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "SELECT",
              "trigger": "Check if measure exists",
              "conditions": ["Always"],
              "implementation": "entity.NewMeasureQuerySet(db.GetDB()).CostIDEq(input.CostID).One(&ret)"
            },
            {
              "operation": "SELECT",
              "trigger": "Get unit info",
              "conditions": ["Always"],
              "implementation": "(&UnitModel{}).GetUnit(input.Unit)"
            },
            {
              "operation": "INSERT",
              "trigger": "Insert measure record",
              "conditions": ["Always"],
              "implementation": "costEntity.Create(db.GetDB().Clauses(clause.Insert{Modifier: \"IGNORE\"}))"
            }
          ]
        },
        "aws_sqs": {
          "conditions": ["config.EnableQueueMeasure == true"],
          "operations": [
            {
              "operation": "RECEIVE",
              "trigger": "Receive messages from SQS dead-letter queue",
              "conditions": ["config.EnableQueueMeasure == true"],
              "implementation": "sqsClient.ReceiveMessage(&sqs.ReceiveMessageInput{QueueUrl: dlQueueURL, ...})"
            },
            {
              "operation": "DELETE",
              "trigger": "Delete processed messages",
              "conditions": ["Message processed successfully"],
              "implementation": "sqsClient.DeleteMessageBatch(&sqs.DeleteMessageBatchInput{QueueUrl: dlQueueURL, Entries: deleteData})"
            }
          ]
        }
      },
      "services": []
    },
    "Runtime CalculateWorker.CalculateWorkerFunc": {
      "infrastructure": {
        "mysql": {
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "SELECT",
              "trigger": "Get all cost centers",
              "conditions": ["Always"],
              "implementation": "costCenterModel.GetAllCostCenters()"
            },
            {
              "operation": "SELECT",
              "trigger": "Get units by cost center org ID and sku type",
              "conditions": ["CostCenter.Status == done"],
              "implementation": "(&UnitModel{}).GetOrgUnitsByType(costCenterOrgID, entity.UnitSkuType_COST)"
            },
            {
              "operation": "SELECT",
              "trigger": "Get measures for calculation date",
              "conditions": ["CostCenter.status == done"],
              "implementation": "entity.NewMeasureQuerySet(db.GetDB()).UnitIn(units...).StatusEq(entity.MeasureStatus_INIT).CostTimeGte(CalculateDate).CostTimeLt(CalculateDate.AddDate(0, 0, 1)).All(&measures)"
            },
            {
              "operation": "SELECT",
              "trigger": "Get cost unit measures for DealMeasureByCost - measures query",
              "conditions": ["CostCenter.status == done"],
              "implementation": "entity.NewMeasureQuerySet(db.GetDB()).UnitEq(costUnit).StatusEq(entity.MeasureStatus_INIT).CostTimeGte(CalculateDate).CostTimeLt(CalculateDate.AddDate(0, 0, 1)).All(&costMeasures)"
            },
            {
              "operation": "UPDATE",
              "trigger": "Update measure status and cost price",
              "conditions": ["costCenter.status == done"],
              "implementation": "tx.Model(&entity.Measure{}).Where(\"cost_id = ?\", measure.CostID).Updates(measure)"
            },
            {
              "operation": "UPDATE",
              "trigger": "Mark cost unit measures as DONE",
              "conditions": ["costCenter.status == done"],
              "implementation": "entity.NewMeasureQuerySet(db.GetDB()).UnitEq(costUnit).CostTimeGte(CalculateDate).CostTimeLt(CalculateDate.AddDate(0, 0, 1)).GetUpdater().SetStatus(entity.CostCenterStatus_DONE).Update()"
            }
          ]
        }
      },
      "services": []
    },
    "HTTP GET /version": {
      "infrastructure": {},
      "services": []
    },
    "HTTP GET /metrics": {
      "infrastructure": {},
      "services": []
    },
    "HTTP GET /debug/pprof/": {
      "infrastructure": {},
      "services": []
    },
    "HTTP GET /debug/pprof/cmdline": {
      "infrastructure": {},
      "services": []
    },
    "HTTP GET /debug/pprof/profile": {
      "infrastructure": {},
      "services": []
    },
    "HTTP POST /debug/pprof/symbol": {
      "infrastructure": {},
      "services": []
    },
    "HTTP GET /debug/pprof/symbol": {
      "infrastructure": {},
      "services": []
    },
    "HTTP GET /debug/pprof/trace": {
      "infrastructure": {},
      "services": []
    },
    "HTTP GET /debug/pprof/allocs": {
      "infrastructure": {},
      "services": []
    },
    "HTTP GET /debug/pprof/block": {
      "infrastructure": {},
      "services": []
    },
    "HTTP GET /debug/pprof/goroutine": {
      "infrastructure": {},
      "services": []
    },
    "HTTP GET /debug/pprof/heap": {
      "infrastructure": {},
      "services": []
    },
    "HTTP GET /debug/pprof/mutex": {
      "infrastructure": {},
      "services": []
    },
    "HTTP GET /debug/pprof/threadcreate": {
      "infrastructure": {},
      "services": []
    }
  }
}
