first commit

This commit is contained in:
2026-07-16 20:48:43 -03:00
commit 5696cee264
1111 changed files with 322270 additions and 0 deletions
@@ -0,0 +1,114 @@
import { Schema, model, Model, FilterQuery } from "mongoose";
import {
CreateDiscountEmailParams,
DeleteDiscountEmailParams,
FindDiscountsEmailParams,
IDiscountEmail,
IDiscountEmailDocument,
IDiscountsEmailAdapter,
PaginateDiscountsEmailParams,
PaginateDiscountsEmailResults,
} from "./DiscountsEmail.Interface";
export class DiscountsEmailAdapterMongoose implements IDiscountsEmailAdapter {
private schema: Schema;
private discountsEmailList: Model<IDiscountEmailDocument>;
constructor() {
this.schema = new Schema({
companyId: {
type: Schema.Types.ObjectId,
required: true,
ref: "Company",
},
discountId: {
type: Schema.Types.ObjectId,
required: true,
ref: "Discount",
},
email: { type: String, required: true },
startDate: { type: Date, required: true },
endDate: { type: Date, required: true },
createdAt: { type: Date, default: Date.now, required: true },
});
this.discountsEmailList = model<IDiscountEmailDocument>("DiscountsEmail", this.schema);
}
public async create(data: Omit<CreateDiscountEmailParams, "sessionUser">): Promise<IDiscountEmail> {
await this.cleanUp();
return await this.discountsEmailList.create(data);
}
public async delete(data: Omit<DeleteDiscountEmailParams, "sessionUser">): Promise<void> {
await this.cleanUp();
await this.discountsEmailList.deleteOne({ _id: data.id });
}
public async find(filters: Omit<FindDiscountsEmailParams, "sessionUser">): Promise<IDiscountEmail[]> {
await this.cleanUp();
const searchCriteria = this.buildSearchCriteria(filters);
return await this.discountsEmailList.find(searchCriteria).exec();
}
public async deleteMany(filters: Omit<FindDiscountsEmailParams, "sessionUser">): Promise<void> {
await this.cleanUp();
const searchCriteria = this.buildSearchCriteria(filters);
await this.discountsEmailList.deleteMany(searchCriteria).exec();
}
public async findOne(
filters: Omit<FindDiscountsEmailParams, "sessionUser">
): Promise<IDiscountEmailDocument | null> {
await this.cleanUp();
const searchCriteria = this.buildSearchCriteria(filters);
return await this.discountsEmailList.findOne(searchCriteria).exec();
}
private async cleanUp() {
await this.discountsEmailList.deleteMany({ endDate: { $lt: new Date() } });
}
private buildSearchCriteria(
filters: Omit<FindDiscountsEmailParams, "sessionUser">
): FilterQuery<IDiscountEmail> {
const searchCriteria: FilterQuery<IDiscountEmail> = {};
if (filters.id) searchCriteria._id = filters.id;
if (filters.companyId) searchCriteria.companyId = filters.companyId;
if (filters.discountId) searchCriteria.discountId = filters.discountId;
if (filters.email) searchCriteria.email = filters.email;
if (filters.searchDate) {
searchCriteria.startDate = {
$lte: filters.searchDate,
};
searchCriteria.endDate = {
$gte: filters.searchDate,
};
}
return searchCriteria;
}
public async paginate(filters: PaginateDiscountsEmailParams): Promise<PaginateDiscountsEmailResults> {
await this.cleanUp();
const searchCriteria = this.buildSearchCriteria(filters);
const count = await this.discountsEmailList.countDocuments(searchCriteria).exec();
const skip = (filters.page - 1) * filters.limit;
const results = await this.discountsEmailList
.find(searchCriteria)
.skip(skip)
.limit(filters.limit)
.sort({ createdAt: -1 })
.exec();
let pages = Math.ceil(count / filters.limit);
if (pages == 0) {
pages = 1;
}
return { data: results, page: filters.page, pages: pages };
}
}
@@ -0,0 +1,90 @@
import { Document } from "mongoose";
export interface IDiscountEmail {
id?: string;
_id?: string;
companyId: string;
discountId: string;
email: string;
startDate: Date;
endDate: Date;
createdAt: Date;
}
export interface IDiscountEmailDocument extends Omit<IDiscountEmail, "id" | "_id">, Document {
_id: string;
}
export interface IDiscountsEmailAdapter {
create(data: Omit<CreateDiscountEmailParams, "sessionUser">): Promise<IDiscountEmail>;
delete(data: Omit<DeleteDiscountEmailParams, "sessionUser">): Promise<void>;
find(filters: Omit<FindDiscountsEmailParams, "sessionUser">): Promise<IDiscountEmail[]>;
findOne(filters: Omit<FindDiscountsEmailParams, "sessionUser">): Promise<IDiscountEmailDocument | null>;
paginate(filters: PaginateDiscountsEmailParams): Promise<PaginateDiscountsEmailResults>;
}
export type DiscountEmailView = {
id: string;
companyId: string;
discountId: string;
discountName: string;
discountType: string;
discountValue: number;
discountCode: string;
email: string;
startDate: Date;
endDate: Date;
};
export type FindDiscountsEmailParams = {
id?: string;
companyId: string;
discountId?: string;
email?: string;
sessionUser: string;
searchDate?: Date;
};
export type PaginateDiscountsEmailParams = FindDiscountsEmailParams & {
page: number;
limit: number;
};
export type PaginateDiscountsEmailResults = {
data: IDiscountEmail[];
page: number;
pages: number;
};
export type PaginateDiscountsEmailViewResults = {
data: DiscountEmailView[];
page: number;
pages: number;
};
export type CreateDiscountEmailParams = {
companyId: string;
discountId: string;
email: string;
startDate: Date;
endDate: Date;
sessionUser: string;
};
export type DeleteDiscountEmailParams = {
id: string;
companyId: string;
sessionUser: string;
};
export type DeleteDiscountsEmailByCompanyParams = {
companyId: string;
};
export interface IDiscountsEmailManager {
discountsEmail: IDiscountsEmailAdapter;
deleteDiscountsEmailByCompany(data: DeleteDiscountsEmailByCompanyParams): Promise<void>;
createDiscountEmail(data: CreateDiscountEmailParams): Promise<IDiscountEmail>;
deleteDiscountEmail(data: DeleteDiscountEmailParams): Promise<void>;
paginate(data: PaginateDiscountsEmailParams): Promise<PaginateDiscountsEmailViewResults>;
}
@@ -0,0 +1,115 @@
import { validatePermissionsByCompany, validateSessionUser } from "../../helpers/check";
import {
CreateDiscountEmailParams,
DeleteDiscountEmailParams,
DeleteDiscountsEmailByCompanyParams,
DiscountEmailView,
IDiscountEmail,
IDiscountsEmailManager,
PaginateDiscountsEmailParams,
PaginateDiscountsEmailViewResults,
} from "./DiscountsEmail.Interface";
import { DiscountsEmailAdapterMongoose } from "./DiscountsEmail.Adapter.Mongoose";
import Discounts from "../Discounts/Discounts";
import { isNull } from "../../helpers/IsNull";
export class DiscountsEmailManager implements IDiscountsEmailManager {
discountsEmail: DiscountsEmailAdapterMongoose;
constructor() {
this.discountsEmail = new DiscountsEmailAdapterMongoose();
}
public async deleteDiscountsEmailByCompany(data: DeleteDiscountsEmailByCompanyParams): Promise<void> {
await this.discountsEmail.deleteMany({
companyId: data.companyId,
});
}
async createDiscountEmail(data: CreateDiscountEmailParams): Promise<IDiscountEmail> {
await validateSessionUser({
sessionUser: data.sessionUser,
});
await validatePermissionsByCompany({
companyId: data.companyId,
sessionUser: data.sessionUser,
});
const checkDiscount = await this.discountsEmail.findOne({
companyId: data.companyId,
email: data.email,
});
if (checkDiscount) {
throw new Error(
"Ya existe un descuento registrado para el correo electrónico. Si el mismo no esta vigente, debe ser eliminado para crear uno nuevo."
);
}
// La lógica de negocio se implementará aquí
const discount = this.discountsEmail.create(data);
if (!discount) {
throw new Error("No se ha podido crear el descuento.");
}
return discount;
}
async deleteDiscountEmail(data: DeleteDiscountEmailParams): Promise<void> {
await validateSessionUser({
sessionUser: data.sessionUser,
});
const discount = await this.discountsEmail.findOne({ id: data.id, companyId: data.companyId });
if (!discount) {
throw new Error("El descuento que intenta eliminar no existe");
}
await validatePermissionsByCompany({
companyId: String(discount.companyId),
sessionUser: data.sessionUser,
});
await this.discountsEmail.delete(data);
}
async paginate(data: PaginateDiscountsEmailParams): Promise<PaginateDiscountsEmailViewResults> {
const paginationData = await this.discountsEmail.paginate(data);
const returnData: PaginateDiscountsEmailViewResults = {
data: [],
page: paginationData.page,
pages: paginationData.pages,
};
let items: DiscountEmailView[] = [];
for (const item of paginationData.data) {
const discount = await Discounts.discounts.discountsList.findOne({ _id: item.discountId });
if (!discount) continue;
const returnItem: DiscountEmailView = {
id: isNull<string>(item.id, ""),
email: item.email,
companyId: item.companyId,
discountId: item.discountId,
discountName: discount.name,
discountType: discount.type,
discountValue: discount.value,
discountCode: discount.code,
startDate: item.startDate,
endDate: item.endDate,
};
items.push(returnItem);
}
returnData.data = items;
return returnData;
}
}
export default new DiscountsEmailManager();