| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
- import Order, { OrderType } from 'App/Models/Order'
- import PaginationService from 'App/Services/PaginationService'
- import { schema } from '@ioc:Adonis/Core/Validator'
- import { BadRequestException } from 'App/Exceptions/Common'
- import Series from 'App/Models/Series'
- import Episode from 'App/Models/Episode'
- import UserBalanceService from 'App/Services/UserBalanceService'
- import Decimal from 'decimal.js'
- import BalanceRecord, { BalanceRecordType } from 'App/Models/BalanceRecord'
- export default class OrdersController {
- private paginationService = new PaginationService(Order)
- public async index({ request, auth }: HttpContextContract) {
- const page = await this.paginationService.paginate({
- ...request.all(),
- userId: auth.user!.id
- })
- const seriesIds = new Set(
- page
- .all()
- .map((record) => record.seriesId)
- .filter((id) => !!id)
- )
- const series = await Series.findMany(Array.from(seriesIds))
- const episodeIds = new Set(
- page
- .all()
- .map((record) => record.episodeId)
- .filter((id) => !!id)
- )
- const episodes = await Episode.findMany(Array.from(episodeIds))
- page.all().forEach((record) => {
- if (record.seriesId) {
- record.series = series.find((s) => s.id === record.seriesId)
- }
- if (record.episodeId) {
- record.episode = episodes.find((e) => e.id === record.episodeId)
- }
- })
- return page
- }
- public async store({ request, auth }: HttpContextContract) {
- const user = auth.user!
- const data = await request.validate({
- schema: schema.create({
- seriesId: schema.number.optional(),
- episodeId: schema.number.optional()
- })
- })
- if (!data.seriesId && !data.episodeId) {
- throw new BadRequestException('seriesId or episodeId must be provided')
- }
- const userBalance = await UserBalanceService.getBalance(user.id)
- const order = new Order()
- order.merge(data)
- order.userId = user.id
- let price: Decimal
- if (data.seriesId) {
- const series = await Series.findOrFail(data.seriesId)
- if (series.price.comparedTo(userBalance.balance) > 0) {
- throw new Error('not enough balance')
- }
- price = series.price
- } else {
- const episode = await Episode.findOrFail(data.episodeId)
- if (episode.price.comparedTo(userBalance.balance) > 0) {
- throw new Error('not enough balance')
- }
- price = episode.price
- }
- await UserBalanceService.modifiyBalance({
- userId: user.id,
- amount: price.negated(),
- type: BalanceRecordType.Purchase,
- seriesId: data.seriesId,
- episodeId: data.episodeId
- })
- return await Order.create({
- userId: user.id,
- price,
- type: data.seriesId ? OrderType.Series : OrderType.Episode,
- ...data
- })
- }
- public async show({ params }: HttpContextContract) {
- return await Order.findOrFail(params.id)
- }
- public async update({ response }: HttpContextContract) {
- response.notImplemented()
- }
- public async destroy({ response }: HttpContextContract) {
- response.notImplemented()
- }
- }
|