using model for each instance

This commit is contained in:
Kfir Dayan 2023-06-14 21:30:04 +03:00
parent 4c25aa65fe
commit 8329a33271
9 changed files with 111 additions and 78 deletions

View file

@ -1,5 +1,7 @@
import { Request, Response } from 'express';
import { Cart, ICart, Order, Product } from '../mongoose/Schema';
import { Cart, ICart } from '../models/cartModel';
import { Product } from '../models/productModel';
import { Order } from '../models/orderModel';
import { sendEmailasync } from '../services/sendGrid';
import { config } from 'dotenv';

View file

@ -1,5 +1,5 @@
import { Request, Response } from 'express';
import { Product, IProduct } from '../mongoose/Schema';
import { Product, IProduct } from '../models/productModel';
export async function createProduct(req: Request, res: Response) {
try {

View file

@ -1,7 +1,7 @@
import { Request, Response } from 'express';
import bcrypt from 'bcryptjs';
import jwt from 'jsonwebtoken';
import { User, IUser } from '../mongoose/Schema';
import { User, IUser } from '../models/userModel';
import { clearJwtCookie, setJwtCookie } from '../middlewares/checkAuth';
import validate from 'deep-email-validator';

23
src/models/cartModel.ts Normal file
View file

@ -0,0 +1,23 @@
import mongoose, { Schema, Document } from 'mongoose';
interface ICart extends Document {
userId: string;
products: { [itemId: string]: number };
createdAt: Date;
updatedAt: Date;
}
const CartSchema: Schema = new Schema({
userId: { type: Schema.Types.ObjectId, ref: 'User', required: true, unique: true },
products: { type: Schema.Types.Mixed, default: {} },
createdAt: { type: Date, default: Date.now },
updatedAt: { type: Date, default: Date.now },
});
const Cart = mongoose.model<ICart>('Cart', CartSchema);
export {
Cart,
ICart
}

27
src/models/orderModel.ts Normal file
View file

@ -0,0 +1,27 @@
import mongoose, { Schema, Document } from 'mongoose';
interface IOrder extends Document {
userId: string;
products: { [itemId: string]: number };
emailSent: boolean;
createdAt: Date;
updatedAt: Date;
}
const OrderSchema: Schema = new Schema({
userId: { type: Schema.Types.ObjectId, ref: 'User', required: true },
products: { type: Schema.Types.Mixed, default: {} },
emailSent: { type: Boolean, default: false },
createdAt: { type: Date, default: Date.now },
updatedAt: { type: Date, default: Date.now },
});
const Order = mongoose.model<IOrder>('Order', OrderSchema);
export {
Order,
IOrder
};

View file

@ -0,0 +1,28 @@
import mongoose, { Schema, Document } from 'mongoose';
interface IProduct extends Document {
name: string;
description: string;
price: number;
userId: string;
createdAt: Date;
updatedAt: Date;
}
const ProductSchema: Schema = new Schema({
name: { type: String, required: true },
description: { type: String, required: true },
price: { type: Number, required: true },
userId: { type: Schema.Types.ObjectId, ref: 'User', required: true },
createdAt: { type: Date, default: Date.now },
updatedAt: { type: Date, default: Date.now },
});
const Product = mongoose.model<IProduct>('Product', ProductSchema);
ProductSchema.index({ name: 1, userId: 1 }, { unique: true });
export {
Product,
IProduct
}

26
src/models/userModel.ts Normal file
View file

@ -0,0 +1,26 @@
// src/models/userModel.ts
import mongoose, { Schema, Document } from 'mongoose';
interface IUser extends Document {
email: string;
password: string;
address: string;
createdAt: Date;
updatedAt: Date;
}
const UserSchema: Schema = new Schema({
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
address: { type: String, required: true },
createdAt: { type: Date, default: Date.now },
updatedAt: { type: Date, default: Date.now },
});
const User = mongoose.model<IUser>('User', UserSchema);
export {
User,
IUser
}

View file

@ -1,74 +0,0 @@
import mongoose, { Schema, Document } from 'mongoose';
export interface IUser extends Document {
email: string;
password: string;
address: string;
createdAt: Date;
updatedAt: Date;
}
export interface IProduct extends Document {
name: string;
description: string;
price: number;
userId: string;
createdAt: Date;
updatedAt: Date;
}
export interface ICart extends Document {
userId: string;
products: { [itemId: string]: number };
createdAt: Date;
updatedAt: Date;
}
export interface IOrder extends Document {
userId: string;
products: { [itemId: string]: number };
emailSent: boolean;
createdAt: Date;
updatedAt: Date;
}
const UserSchema: Schema = new Schema({
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
address: { type: String, required: true },
createdAt: { type: Date, default: Date.now },
updatedAt: { type: Date, default: Date.now },
});
const ProductSchema: Schema = new Schema({
name: { type: String, required: true },
description: { type: String, required: true },
price: { type: Number, required: true },
userId: { type: Schema.Types.ObjectId, ref: 'User', required: true },
createdAt: { type: Date, default: Date.now },
updatedAt: { type: Date, default: Date.now },
});
const CartSchema: Schema = new Schema({
userId: { type: Schema.Types.ObjectId, ref: 'User', required: true, unique: true },
products: { type: Schema.Types.Mixed, default: {} },
createdAt: { type: Date, default: Date.now },
updatedAt: { type: Date, default: Date.now },
});
const OrderSchema: Schema = new Schema({
userId: { type: Schema.Types.ObjectId, ref: 'User', required: true },
products: { type: Schema.Types.Mixed, default: {} },
emailSent: { type: Boolean, default: false },
createdAt: { type: Date, default: Date.now },
updatedAt: { type: Date, default: Date.now },
});
ProductSchema.index({ name: 1, userId: 1 }, { unique: true });
const User = mongoose.model<IUser>('User', UserSchema);
const Product = mongoose.model<IProduct>('Product', ProductSchema);
const Cart = mongoose.model<ICart>('Cart', CartSchema);
const Order = mongoose.model<IOrder>('Order', OrderSchema);
export { User, Product, Cart, Order };

View file

@ -1,5 +1,6 @@
import { config } from "dotenv";
import { User, Order } from "../mongoose/Schema";
import { Order } from "../models/orderModel";
import { User } from "../models/userModel";
import client from '@sendgrid/mail';
config();