Fix users being able to claim a card twice if the user has multiple of it already
This commit is contained in:
parent
74cdf818d1
commit
ad505b3ea2
7 changed files with 87 additions and 15 deletions
|
@ -0,0 +1,8 @@
|
|||
CREATE TABLE `claim` (
|
||||
`Id` varchar(255) NOT NULL,
|
||||
`WhenCreated` datetime NOT NULL,
|
||||
`WhenUpdated` datetime NOT NULL,
|
||||
`ClaimId` varchar(255) NOT NULL,
|
||||
`InventoryId` varchar(255) NOT NULL,
|
||||
PRIMARY KEY (`Id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
|
|
@ -0,0 +1,10 @@
|
|||
INSERT INTO claim (
|
||||
Id,
|
||||
ClaimId,
|
||||
InventoryId
|
||||
)
|
||||
SELECT
|
||||
UUID(),
|
||||
ClaimId,
|
||||
Id
|
||||
FROM inventory;
|
|
@ -0,0 +1,2 @@
|
|||
ALTER TABLE inventory
|
||||
DROP ClaimId;
|
|
@ -2,6 +2,7 @@ import { ButtonInteraction } from "discord.js";
|
|||
import { ButtonEvent } from "../type/buttonEvent";
|
||||
import Inventory from "../database/entities/app/Inventory";
|
||||
import { CoreClient } from "../client/client";
|
||||
import { default as eClaim } from "../database/entities/app/Claim";
|
||||
|
||||
export default class Claim extends ButtonEvent {
|
||||
public override async execute(interaction: ButtonInteraction) {
|
||||
|
@ -11,7 +12,7 @@ export default class Claim extends ButtonEvent {
|
|||
const claimId = interaction.customId.split(' ')[2];
|
||||
const userId = interaction.user.id;
|
||||
|
||||
const claimed = await Inventory.FetchOneByClaimId(claimId);
|
||||
const claimed = await eClaim.FetchOneByClaimId(claimId);
|
||||
|
||||
if (claimed) {
|
||||
await interaction.reply('This card has already been claimed');
|
||||
|
@ -26,13 +27,24 @@ export default class Claim extends ButtonEvent {
|
|||
let inventory = await Inventory.FetchOneByCardNumberAndUserId(userId, cardNumber);
|
||||
|
||||
if (!inventory) {
|
||||
inventory = new Inventory(userId, cardNumber, 1, claimId);
|
||||
inventory = new Inventory(userId, cardNumber, 1);
|
||||
} else {
|
||||
inventory.SetQuantity(inventory.Quantity + 1);
|
||||
}
|
||||
|
||||
await inventory.Save(Inventory, inventory);
|
||||
|
||||
const claim = new eClaim(claimId);
|
||||
await claim.Save(eClaim, claim);
|
||||
|
||||
inventory = await Inventory.FetchOneById(Inventory, inventory.Id, [ "Claims" ]);
|
||||
|
||||
if (inventory) {
|
||||
inventory.AddClaim(claim);
|
||||
|
||||
await inventory.Save(Inventory, inventory);
|
||||
}
|
||||
|
||||
await interaction.reply('Card claimed');
|
||||
}
|
||||
}
|
27
src/database/entities/app/Claim.ts
Normal file
27
src/database/entities/app/Claim.ts
Normal file
|
@ -0,0 +1,27 @@
|
|||
import { Column, Entity, ManyToOne } from "typeorm";
|
||||
import AppBaseEntity from "../../../contracts/AppBaseEntity";
|
||||
import Inventory from "./Inventory";
|
||||
import AppDataSource from "../../dataSources/appDataSource";
|
||||
|
||||
@Entity()
|
||||
export default class Claim extends AppBaseEntity {
|
||||
constructor(claimId: string) {
|
||||
super();
|
||||
|
||||
this.ClaimId = claimId;
|
||||
}
|
||||
|
||||
@Column()
|
||||
ClaimId: string;
|
||||
|
||||
@ManyToOne(() => Inventory, x => x.Claims)
|
||||
Inventory: Inventory;
|
||||
|
||||
public static async FetchOneByClaimId(claimId: string): Promise<Claim | null> {
|
||||
const repository = AppDataSource.getRepository(Claim);
|
||||
|
||||
const single = await repository.findOne({ where: { ClaimId: claimId }});
|
||||
|
||||
return single;
|
||||
}
|
||||
}
|
|
@ -1,16 +1,16 @@
|
|||
import { Column, Entity } from "typeorm";
|
||||
import { Column, Entity, OneToMany } from "typeorm";
|
||||
import AppBaseEntity from "../../../contracts/AppBaseEntity";
|
||||
import AppDataSource from "../../dataSources/appDataSource";
|
||||
import Claim from "./Claim";
|
||||
|
||||
@Entity()
|
||||
export default class Inventory extends AppBaseEntity {
|
||||
constructor(userId: string, cardNumber: string, quantity: number, claimId: string) {
|
||||
constructor(userId: string, cardNumber: string, quantity: number) {
|
||||
super();
|
||||
|
||||
this.UserId = userId;
|
||||
this.CardNumber = cardNumber;
|
||||
this.Quantity = quantity;
|
||||
this.ClaimId = claimId;
|
||||
}
|
||||
|
||||
@Column()
|
||||
|
@ -22,13 +22,17 @@ export default class Inventory extends AppBaseEntity {
|
|||
@Column()
|
||||
Quantity: number;
|
||||
|
||||
@Column()
|
||||
ClaimId: string;
|
||||
@OneToMany(() => Claim, x => x.Inventory)
|
||||
Claims: Claim[];
|
||||
|
||||
public SetQuantity(quantity: number) {
|
||||
this.Quantity = quantity;
|
||||
}
|
||||
|
||||
public AddClaim(claim: Claim) {
|
||||
this.Claims.push(claim);
|
||||
}
|
||||
|
||||
public static async FetchOneByCardNumberAndUserId(userId: string, cardNumber: string): Promise<Inventory | null> {
|
||||
const repository = AppDataSource.getRepository(Inventory);
|
||||
|
||||
|
@ -36,12 +40,4 @@ export default class Inventory extends AppBaseEntity {
|
|||
|
||||
return single;
|
||||
}
|
||||
|
||||
public static async FetchOneByClaimId(claimId: string): Promise<Inventory | null> {
|
||||
const repository = AppDataSource.getRepository(Inventory);
|
||||
|
||||
const single = await repository.findOne({ where: { ClaimId: claimId }});
|
||||
|
||||
return single;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
import { MigrationInterface, QueryRunner } from "typeorm"
|
||||
import MigrationHelper from "../../../../helpers/MigrationHelper"
|
||||
|
||||
export class CreateClaim1694609771821 implements MigrationInterface {
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
MigrationHelper.Up('1694609771821-CreateClaim', '0.1.5', [
|
||||
'01-CreateClaim',
|
||||
'02-MoveToClaim',
|
||||
'03-AlterInventory',
|
||||
], queryRunner);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue