first commit
This commit is contained in:
@@ -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();
|
||||
Reference in New Issue
Block a user