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,106 @@
import dayjs from "dayjs";
import {
FindPlanSuscripcionsParams,
IPlanSuscriptionsAdapter,
IPlanSuscription,
CreatePlanSuscriptionParams,
CancellPlanSuscriptionParams,
} from "./PlanSubscriptions.interface";
import { Document, Model, Schema, model } from "mongoose";
export interface IPlanSuscriptionDocument extends Omit<IPlanSuscription, "id">, Document {}
export enum MP_SUBS_STATUS {
PENDING = "pending",
AUTHORIZED = "authorized",
PAUSED = "paused",
CANCELLED = "cancelled",
}
export class PlanSuscriptionsAdapterMongoose implements IPlanSuscriptionsAdapter {
schema: Schema;
planSuscriptionList: Model<IPlanSuscriptionDocument>;
constructor() {
this.schema = new Schema({
userId: { type: Schema.Types.ObjectId, required: true, ref: "User" },
planId: { type: Schema.Types.ObjectId, required: true, ref: "Plan" },
mpPlanId: { type: String, required: false },
startDate: { type: Date, required: true },
endDate: { type: Date, required: true },
isActive: { type: Boolean, required: true, default: true },
autoRenew: { type: Boolean, required: true, default: true },
paymentMethod: { type: String, required: false },
mpPayerId: { type: Number, required: false },
mpPayerEmail: { type: String, required: false },
mpStatus: { type: String, required: false },
mpDateCreated: { type: Date, required: false },
mpInitPoint: { type: String, required: false },
mpPreferenceId: { type: String, required: false },
});
this.planSuscriptionList = model<IPlanSuscriptionDocument>("PlanSuscription", this.schema);
}
public async find(filters: FindPlanSuscripcionsParams): Promise<IPlanSuscription[]> {
return this.planSuscriptionList.find(filters).exec();
}
public async delete(data: CancellPlanSuscriptionParams): Promise<void> {
await this.planSuscriptionList.deleteOne({ userId: data.sessionUser }).exec();
}
public async findOne(
filters: FindPlanSuscripcionsParams
): Promise<IPlanSuscriptionDocument | null> {
let subscription = await this.planSuscriptionList
.findOne({ userId: filters.sessionUser })
.exec();
if (!subscription) {
return null;
}
const dateNow = dayjs(new Date());
const dateEnd = dayjs(subscription.endDate);
try {
if (subscription.mpPreferenceId) {
if (dateNow.isAfter(dateEnd)) {
if (subscription.mpStatus == MP_SUBS_STATUS.CANCELLED) {
subscription.mpPreferenceId = "";
subscription.isActive = false;
subscription.autoRenew = false;
subscription.mpStatus = MP_SUBS_STATUS.CANCELLED;
subscription.mpInitPoint = "";
await subscription.save();
return subscription;
}
// Without subscriptions, we wait for the webhook to update the status.
// If it's expired and not updated by webhook, we just cancel it.
if (subscription.mpStatus === MP_SUBS_STATUS.PENDING) {
subscription.mpPreferenceId = "";
subscription.isActive = false;
subscription.autoRenew = false;
subscription.mpStatus = MP_SUBS_STATUS.CANCELLED;
subscription.mpInitPoint = "";
await subscription.save();
return subscription;
}
}
}
} catch (e) {
console.log("Ha ocurrido un error al revisar el estado de la suscripcion:", e);
}
return subscription;
}
// updateMpStatus was removed as it relied on MercadoPago Subscriptions API.
// Payments status updates are now handled by the WebhookController.
public async create(data: CreatePlanSuscriptionParams): Promise<IPlanSuscriptionDocument> {
return await this.planSuscriptionList.create(data);
}
}