GIF89a php
Current File : /home/viralhoga/glambooth_viralhoga_com/src/controllers/subscription.controller.js
import express from 'express';
import { ApiResponse } from '../utils/ApiResponse.js';
import { Subscription, UserSubscription } from '../models/subscription.model.js';


export const getSubscriptions = async (req, res) => {
    try {
        const subscriptions = await Subscription.find();
        return res.json(new ApiResponse(200, subscriptions, "Subscriptions fetched successfully"));

    } catch (error) {

        console.log(error);

        return res.status(500).json({ message: error.message });
    }
};

export const createSubscription = async (req, res) => {
    try {
        const { name, price, duration } = req.body;
        const subscription = new Subscription({
            name,
            price,
            duration
        });
        await subscription.save();
        return res.json(new ApiResponse(200, subscription, "Subscription created successfully"));
    } catch (error) {
        console.log(error);
        return res.status(500).json({ message: error.message });
    }
};


export const updateSubscription = async (req, res) => {
    try {
        const { id } = req.params;
        const { name, price, duration } = req.body;
        const subscription = await Subscription.findByIdAndUpdate(id, {
            name,
            price,
            duration
        }, { new: true });
        return res.json(new ApiResponse(200, subscription, "Subscription updated successfully"));
    } catch (error) {
        console.log(error);
        return res.status(500).json({ message: error.message });
    }
};


export const addSubscriptionToUser = async (req, res) => {
    try {
        const { userId, subscriptionId } = req.body;

        // Check if user already has an active subscription
        const existingSubscription = await UserSubscription.findOne({
            userId,
            endDate: { $gt: new Date() }
        });

        if (existingSubscription) {
            return res.status(400).json(new ApiResponse(400, null, "User already has an active subscription"));
        }

        const subscription = await Subscription.findById(subscriptionId);
        const startDate = new Date();
        const endDate = new Date();
        endDate.setMonth(endDate.getMonth() + subscription.duration);

        const userSubscription = new UserSubscription({
            userId,
            subscriptionId,
            startDate,
            endDate
        });
        await userSubscription.save();
        return res.json(new ApiResponse(200, userSubscription, "Subscription added to user successfully"));


    } catch (error) {
        console.log(error);
        return res.status(500).json({ message: error.message });
    }
};


export const getUserSubscription = async (req, res) => {
    try {
        const { userId } = req.params;

        const userSubscription = await UserSubscription.findOne({
            userId,
            endDate: { $gt: new Date() }
        }).populate({
            path: 'subscriptionId',
            select: '-__v',
            model: 'Subscription',
            as: 'subscriptionDetails'
        });

        if (!userSubscription) {
            return res.json(new ApiResponse(200, null, "User has no active subscription"));
        }
        const response = {
            ...userSubscription.toObject(),
            subscriptionDetails: userSubscription.subscriptionId
        };
        delete response.subscriptionId; // Optional: Remove the original field

        return res.json(new ApiResponse(200, response, "User subscription fetched successfully"));
    } catch (error) {
        console.log(error);
        return res.status(500).json({ message: error.message });
    }
};