This commit is contained in:
mahyargdz
2025-09-14 15:15:03 +03:30
commit be82059172
534 changed files with 51310 additions and 0 deletions
@@ -0,0 +1,13 @@
import { Expose } from "class-transformer";
import { IsEmail, IsNotEmpty, IsString } from "class-validator";
import { ApiProperty } from "../../../common/decorator/swggerDocs";
export class SubscribeRequestDTO {
@Expose()
@IsNotEmpty()
@IsString()
@IsEmail()
@ApiProperty({ type: "string", description: "email of client", example: "hamid@gmail.com" })
email: string;
}
@@ -0,0 +1,3 @@
export interface INewsletter {
email: string;
}
@@ -0,0 +1,17 @@
import { Schema, model } from "mongoose";
import { INewsletter } from "./Abstractions/INewsletter";
const NewsletterSchema = new Schema<INewsletter>(
{
email: { type: String, required: true },
},
{
timestamps: true,
toJSON: { versionKey: false, virtuals: true },
id: false,
},
);
const NewsletterModel = model<INewsletter>("Newsletter", NewsletterSchema);
export { NewsletterModel };
@@ -0,0 +1,27 @@
import rateLimit from "express-rate-limit";
import { inject } from "inversify";
import { controller, httpPost, requestBody } from "inversify-express-utils";
import { SubscribeRequestDTO } from "./DTO/subscribe.dto";
import { NewsletterService } from "./newsletter.service";
import { HttpStatus } from "../../common";
import { BaseController } from "../../common/base/controller";
import { ApiModel, ApiOperation, ApiResponse, ApiTags } from "../../common/decorator/swggerDocs";
import { appConfig } from "../../core/config/app.config";
import { ValidationMiddleware } from "../../core/middlewares/validator.middleware";
import { IOCTYPES } from "../../IOC/ioc.types";
@controller("/newsletter")
@ApiTags("Newsletter")
export class NewsletterController extends BaseController {
@inject(IOCTYPES.NewsletterService) private newsletterService: NewsletterService;
@ApiOperation("subscribe to newsletter and promotion")
@ApiResponse("created successfully", HttpStatus.Ok)
@ApiModel(SubscribeRequestDTO)
@httpPost("/subscribe", rateLimit(appConfig.rate), ValidationMiddleware.validateInput(SubscribeRequestDTO))
public async createSubscribeRequest(@requestBody() createDto: SubscribeRequestDTO) {
const data = await this.newsletterService.createSubscribeRequest(createDto);
return this.response(data);
}
}
@@ -0,0 +1,13 @@
import { INewsletter } from "./model/Abstractions/INewsletter";
import { NewsletterModel } from "./model/newsletter.model";
import { BaseRepository } from "../../common/base/repository";
export class NewsletterRepo extends BaseRepository<INewsletter> {
constructor() {
super(NewsletterModel);
}
}
export function CreateNewsletterRepo(): NewsletterRepo {
return new NewsletterRepo();
}
@@ -0,0 +1,24 @@
import { inject, injectable } from "inversify";
import { SubscribeRequestDTO } from "./DTO/subscribe.dto";
import { NewsletterRepo } from "./newsletter.repository";
import { CommonMessage } from "../../common/enums/message.enum";
import { IOCTYPES } from "../../IOC/ioc.types";
@injectable()
export class NewsletterService {
@inject(IOCTYPES.NewsletterRepo) private newsletterRepo: NewsletterRepo;
async createSubscribeRequest(createDto: SubscribeRequestDTO) {
await this.newsletterRepo.model.findOneAndUpdate(
{ email: createDto.email },
{
...createDto,
},
{ upsert: true },
);
return {
message: CommonMessage.Created,
};
}
}