node-mongo-demo

node.js and mongodb demo

git clone https://9o.is/git/node-mongo-demo.git

lucky7-bet.js

(1468B)


      1 import mongoose from 'mongoose';
      2 import { randomInt } from 'crypto';
      3 
      4 const lucky7BetSchema = mongoose.Schema({
      5     userId: { type: 'ObjectId', ref: 'User', required: true },
      6     rollAt: { type: Date, required: true },
      7     lucky: { type: Boolean, required: true },
      8     roll: { type: [Number], required: true },
      9 }, {
     10     timestamps: true,
     11     optimisticConcurrency: true,
     12     virtuals: {
     13         state: {
     14             get() {
     15                 return Date.now() < this.rollAt ? 'pending' : 'finished';
     16             },
     17         },
     18         win: {
     19             get() {
     20                 if (!this.played()) return undefined;
     21 
     22                 const seven = 7 === this.roll[0] + this.roll[1];
     23                 return (this.lucky && seven) || (!this.lucky && !seven);
     24             },
     25         },
     26     },
     27     methods: {
     28         played() {
     29             return Boolean(this.roll?.length === 2);
     30         },
     31         play() {
     32             this.roll = [randomInt(1,7), randomInt(1,7)];
     33         },
     34         toRedactedObject() {
     35             const { id, rollAt, lucky, roll, win, state } = this;
     36             return {
     37                 id,
     38                 state,
     39                 rollAt,
     40                 lucky,
     41                 roll: state === 'finished' ? roll : undefined,
     42                 win: state === 'finished' ? win : undefined,
     43             };
     44         },
     45     },
     46 });
     47 
     48 lucky7BetSchema.index({ userId: 1, rollAt: -1 }, { unique: true });
     49 
     50 export default mongoose.model('Lucky7Bet', lucky7BetSchema);
     51