105 lines
4.7 KiB
JavaScript
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
|