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