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