Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | 77x 77x 77x 54x 54x 54x 23x 77x 77x 77x | import { Schema, model } from "mongoose";
import { RequiredNumber, RequiredString, RequiredObjectId, ANumber } from "../utilities/schemaTypesOptions.js";
const RatingSchema = new Schema({
_id: false,
raterId: RequiredObjectId(),
rating: {
type: Number,
required: true,
min: 1,
max: 5
}
})
const ProductSchema = new Schema({
title: RequiredString({ minLength: 6 }),
price: RequiredNumber(),
images: {
type: [String],
required: true
},
category: RequiredString(),
series: RequiredString(),
description: RequiredString({ minLength: 12, maxLength: 300 }),
amount: RequiredNumber(),
count: Number,
earnings: ANumber(),
sold: ANumber(),
ratings: {
type: [RatingSchema],
default: []
},
discount: Number
},
{
timestamps: true,
versionKey: false,
virtuals: {
rating: {
get() {
if (this.ratings) {
const reviews = this.ratings?.length || 0;
const costomersRatings = this.ratings?.reduce((acc, current) => acc + current.rating, 0)
return {
reviews,
ratingAverage: +(costomersRatings / reviews).toFixed(1) || 0
}
}
return;
}
}
},
id: false,
toJSON: {
virtuals: true,
transform(_doc, ret) {
delete ret.ratings;
return ret;
}
}
}
);
const ProductsModel = model("products", ProductSchema);
export default ProductsModel; |