Files
SerpentRace/SerpentRace_Backend/dist/Application/Deck/commands/CreateDeckCommandHandler.js
T

105 lines
4.7 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CreateDeckCommandHandler = void 0;
const DeckAggregate_1 = require("../../../Domain/Deck/DeckAggregate");
const UserAggregate_1 = require("../../../Domain/User/UserAggregate");
const DeckMapper_1 = require("../../DTOs/Mappers/DeckMapper");
const AdminBypassService_1 = require("../../Services/AdminBypassService");
const Logger_1 = require("../../Services/Logger");
class CreateDeckCommandHandler {
constructor(deckRepo, userRepo, orgRepo) {
this.deckRepo = deckRepo;
this.userRepo = userRepo;
this.orgRepo = orgRepo;
}
async execute(cmd) {
try {
// 1. Get user details
const user = await this.userRepo.findById(cmd.userid);
if (!user) {
throw new Error('User not found');
}
// 2. ADMIN BYPASS - Skip all restrictions
if (AdminBypassService_1.AdminBypassService.shouldBypassRestrictions(user.state)) {
AdminBypassService_1.AdminBypassService.logAdminBypass('CREATE_DECK_BYPASS', user.id, 'new-deck', {
deckName: cmd.name,
deckType: cmd.type,
cardCount: cmd.cards.length,
ctype: cmd.ctype
});
return this.createDeck(cmd);
}
// 3. Check deck count limits for regular users
const userDeckCount = await this.deckRepo.countActiveByUserId(cmd.userid);
const maxDecks = user.state === UserAggregate_1.UserState.VERIFIED_PREMIUM ? 12 : 8;
if (userDeckCount >= maxDecks) {
throw new Error(`Deck limit exceeded. Maximum ${maxDecks} decks allowed for your account type.`);
}
// 4. Organizational deck restrictions
if (cmd.ctype === DeckAggregate_1.CType.ORGANIZATION) {
// Only premium users can create organizational decks
if (user.state !== UserAggregate_1.UserState.VERIFIED_PREMIUM) {
throw new Error('Only premium users can create organizational decks.');
}
// User must belong to an organization
if (!user.orgid) {
throw new Error('You must be a member of an organization to create organizational decks.');
}
// Check organization limits
const org = await this.orgRepo.findById(user.orgid);
if (!org) {
throw new Error('Organization not found.');
}
if (org.maxOrganizationalDecks === null) {
throw new Error('Organization deck limit not configured. Contact administrator.');
}
const userOrgDeckCount = await this.deckRepo.countOrganizationalByUserId(cmd.userid);
if (userOrgDeckCount >= org.maxOrganizationalDecks) {
throw new Error(`Organization deck limit exceeded. Maximum ${org.maxOrganizationalDecks} organizational decks allowed.`);
}
}
// 5. Create deck with restrictions passed
return this.createDeck(cmd);
}
catch (error) {
if (error instanceof Error) {
throw error; // Re-throw known errors with original message
}
throw new Error('Failed to create deck');
}
}
/**
* Private method to create deck after all validations
*/
async createDeck(cmd) {
const deck = new DeckAggregate_1.DeckAggregate();
deck.name = cmd.name;
deck.type = cmd.type;
deck.userid = cmd.userid;
deck.cards = cmd.cards;
deck.ctype = cmd.ctype ?? DeckAggregate_1.CType.PUBLIC;
deck.state = DeckAggregate_1.State.ACTIVE;
// Set organization reference for organizational decks
if (cmd.ctype === DeckAggregate_1.CType.ORGANIZATION) {
const user = await this.userRepo.findById(cmd.userid);
if (user?.orgid) {
const org = await this.orgRepo.findById(user.orgid);
if (org) {
deck.organization = org;
}
}
}
const created = await this.deckRepo.create(deck);
(0, Logger_1.logRequest)('Deck created successfully', undefined, undefined, {
deckId: created.id,
userId: cmd.userid,
deckName: cmd.name,
deckType: cmd.type,
ctype: cmd.ctype,
cardCount: cmd.cards.length
});
return DeckMapper_1.DeckMapper.toShortDto(created);
}
}
exports.CreateDeckCommandHandler = CreateDeckCommandHandler;
//# sourceMappingURL=CreateDeckCommandHandler.js.map