settings/controllers/apiUsagePricing.js

181 lines
4.3 KiB
JavaScript
Raw Normal View History

2024-07-30 11:26:42 +00:00
const { StatusCodes } = require("http-status-codes")
const API_Pricing = require("../models/API_Pricing.js")
const {
mustContainProperties,
calculateApiUsage,
} = require('../utils')
const API_Usage = require("../models/API_Usage.js")
const billingSumUsage = require("../utils/billingSumUsage.js")
const moment = require('moment')
const API_Call = require("../models/API_Call.js")
const API_Operation = require("../models/API_Operation.js")
2024-07-30 11:26:42 +00:00
const setApiPricing = async (req, res) => {
const { provider, product, currency, price, billingBy, billingUnit, type } = req.body
mustContainProperties(req, ['provider',
'product',
'price',
'billingBy',
'billingUnit'])
const normalizedProvider = provider.trim().toLowerCase()
const normalizedProduct = product.trim().toLowerCase()
const filter = { provider: normalizedProvider, product: normalizedProduct }
const update = {
provider: normalizedProvider,
product: normalizedProduct,
2024-07-30 11:26:42 +00:00
currency,
price,
billingBy,
billingUnit,
type
}
const options = { new: true, upsert: true }
const apiPricing = await API_Pricing.findOneAndUpdate(filter, update, options)
2024-07-30 11:26:42 +00:00
res.status(StatusCodes.OK).json({ apiPricing })
}
const registerUsage = async (req, res) => {
const {
2024-07-30 11:26:42 +00:00
provider,
product,
usage,
callerId,
sessionId,
2024-07-30 11:26:42 +00:00
companyId,
quantityOfOperationAttempts,
2024-07-30 11:26:42 +00:00
} = req.body
mustContainProperties(req, [
'companyId',
'callerId',
'sessionId',
2024-07-30 11:26:42 +00:00
'quantityOfOperationAttempts',
'provider',
'product',
'usage',
])
2024-07-30 11:26:42 +00:00
const apiPricing = await API_Pricing.findOne({
provider: provider.trim().toLowerCase(),
product: product.trim().toLowerCase(),
})
if (apiPricing) {
const { price, billingBy, billingUnit } = apiPricing
2024-07-30 11:26:42 +00:00
const apiUsage = await API_Usage.create({
provider: provider.trim().toLowerCase(),
product: product.trim().toLowerCase(),
callerId,
sessionId,
2024-07-30 11:26:42 +00:00
quantityOfOperationAttempts,
usage,
price,
billingBy,
billingUnit,
2024-07-30 11:26:42 +00:00
companyId,
total_cost: calculateApiUsage(price, billingUnit, usage, billingBy)
})
return res.status(StatusCodes.OK).json({ apiUsage })
}
res.status(StatusCodes.NOT_FOUND).json({ msg: `Price not found for ${product} in the API Pricing table` })
}
const registerAPICall = async (req, res) => {
const {
callerId,
companyId,
sessionId,
type,
requestLogs,
responseError,
quantityOfAPICall
} = req.body
mustContainProperties(req, [
'companyId',
'callerId',
'sessionId'
])
const apiCall = await API_Call.create({
callerId,
companyId,
sessionId,
type,
requestLogs,
responseError,
quantityOfAPICall
})
res.status(StatusCodes.OK).json({ apiCall })
}
const registerOperation = async (req, res) => {
const {
callerId,
companyId,
sessionId,
operation,
} = req.body
mustContainProperties(req, [
'companyId',
'callerId',
'sessionId',
'operation'
])
const apiOperation = await API_Operation.create({
callerId,
companyId,
sessionId,
operation
})
res.status(StatusCodes.OK).json({ apiOperation })
}
2024-07-30 11:26:42 +00:00
const getUsage = async (req, res) => {
const { startDate, endDate, companyId, } = req.body
mustContainProperties(req, ['startDate', 'endDate', 'companyId'])
const total = await billingSumUsage(startDate, endDate, companyId)
if (total) {
const usage = await API_Usage.find({
createdAt: {
$gte: moment(startDate, 'YYYY-MM-DD').startOf('day').toDate(),
$lte: moment(endDate, 'YYYY-MM-DD').endOf('day').toDate()
},
})
return res.status(StatusCodes.OK).json({ usage, total })
}
return res.status(StatusCodes.NOT_FOUND).json({})
}
module.exports = {
setApiPricing,
registerUsage,
registerAPICall,
registerOperation,
2024-07-30 11:26:42 +00:00
getUsage
}