You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

order.ts 2.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. const validator = require('validator');
  2. import { ProductData as IProduct } from '../utils/interface/productInterface';
  3. import { OrderData as IOrder } from '../utils/interface/orderInterface';
  4. import { Schema, model, Types, models } from 'mongoose';
  5. const OrderSchema = new Schema<IOrder>(
  6. {
  7. products: Array<IProduct>,
  8. time: {
  9. type: Date,
  10. required: [true, 'Please provide a date.'],
  11. validate(value: Date) {
  12. if (!validator.isDate(value)) {
  13. throw new Error('Not a date');
  14. }
  15. },
  16. },
  17. shippingAddress: {
  18. country: {
  19. type: String,
  20. required: [true, 'Please provide a country.'],
  21. trim: true,
  22. },
  23. city: {
  24. type: String,
  25. required: [true, 'Please provide a city.'],
  26. trim: true,
  27. },
  28. address: {
  29. type: String,
  30. required: [true, 'Please provide an address.'],
  31. trim: true,
  32. },
  33. address2: {
  34. type: String,
  35. trim: true,
  36. },
  37. postcode: {
  38. type: String,
  39. required: [true, 'Please provide a postal code.'],
  40. },
  41. email: {
  42. type: String,
  43. required: [true, 'Please provide an email.'],
  44. },
  45. fullName: {
  46. type: String,
  47. required: [true, 'Please provide a name.'],
  48. },
  49. },
  50. totalPrice: {
  51. type: Number,
  52. required: [true, 'Please provide a total price.'],
  53. validate(value: number) {
  54. if (value < 0) {
  55. throw new Error('Total price must be a postive number');
  56. }
  57. },
  58. },
  59. numberOfItems: {
  60. type: Number,
  61. required: [true, 'Please provide a total number of items.'],
  62. validate(value: number) {
  63. if (value < 0) {
  64. throw new Error('Number of items must be a postive number');
  65. }
  66. },
  67. },
  68. fulfilled: {
  69. type: Boolean,
  70. default: false,
  71. },
  72. owner: {
  73. type: Types.ObjectId,
  74. required: [true, 'Please provide an owner.'],
  75. ref: 'User',
  76. },
  77. stripeCheckoutId: {
  78. type: String,
  79. required: [true, 'Please provide a stripe checkout id.'],
  80. },
  81. },
  82. {
  83. toJSON: { virtuals: true }, // So `res.json()` and other `JSON.stringify()` functions include virtuals
  84. toObject: { virtuals: true }, // So `console.log()` and other functions that use `toObject()` include virtuals
  85. }
  86. );
  87. const Order = models.Order || model<IOrder>('Order', OrderSchema, 'Order');
  88. module.exports = Order;