moved api from monorepo

This commit is contained in:
2024-09-12 15:48:27 -04:00
parent 734bb0a0d2
commit d575a4efc5
29 changed files with 2904 additions and 0 deletions

104
models/Game.js Normal file
View File

@@ -0,0 +1,104 @@
import mongoose from 'mongoose'
import slugify from 'slugify'
const {Schema, model} = mongoose
const GameSchema = new Schema(
{
title: {type: String, trim: true, required: true},
series: {type: String, trim: true},
steamId: {
type: String,
index: {unique: true, partialFilterExpression: {steamId: {$exists: true, $gt: 0, $type: String}}}
},
slug: String,
frontImage: {type: String, required: true},
screenshots: Array,
genre: {type: Array, sparse: true},
os: {
windows: {type: Boolean},
mac: {type: Boolean},
linux: {type: Boolean},
android: {type: Boolean},
ios: {type: Boolean}
},
wine: {type: String, enum: ['Not Tested', 'Yes', 'No']},
controller: {
type: String,
enum: [
'No Controller Support',
'Partial Controller Support',
'Full Controller Support',
],
},
developer: {type: Array, sparse: true},
publisher: {type: Array, sparse: true},
releaseDate: {type: String},
shortDesc: {type: String},
reviews: String,
summary: String,
intel: {type: String, enum: ['Not Tested', 'Yes', 'No']},
systemRequirements: {
windows: {
minimum: String,
recommended: String,
},
mac: {
minimum: String,
recommended: String,
},
linux: {
minimum: String,
recommended: String,
},
},
steamRating: {type: Number, min: 0, max: 10, default: 0},
createdBy: {
type: Schema.ObjectId,
ref: 'User',
required: true,
},
accessedBy: [
{
user: {
type: Schema.ObjectId,
ref: 'User',
required: true,
},
store: {type: Array, required: true},
playStatus: {
type: String,
enum: ['Never Played', 'Up Next', 'Playing', 'Finished', 'Will Not Play'],
default: 'Never Played',
},
soundtrack: {type: String, enum: ['Yes', 'No'], default: 'No'},
rating: {type: Number, min: 0, max: 10, default: 0}
},
],
lastModifiedBy: {
type: Schema.ObjectId,
ref: 'User',
required: true,
},
},
{timestamps: {createdAt: 'createDate', updatedAt: 'lastUpdateDate'}}
)
GameSchema.pre('save', function (next) {
this.slug = slugify(this.title, {lower: true})
next()
})
GameSchema.index({accessedBy: {user: 1}}, {unique: true})
GameSchema.index({
title: 'text',
series: 'text',
steamId: 'text',
genre: 'text',
developer: 'text',
publisher: 'text',
slug: 'text',
})
export default model('Game', GameSchema)

95
models/User.js Normal file
View File

@@ -0,0 +1,95 @@
import mongoose from 'mongoose'
const { Schema } = mongoose
import gravatar from 'gravatar'
// import crypt from 'argon2'
import jwt from 'jsonwebtoken'
import crypto from 'crypto'
const UserSchema = new Schema({
name: {
type: String,
trim: true,
required: [true, 'Please add a name'],
},
email: {
type: String,
required: [true, 'Please enter a valid email address'],
match: [
/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/,
'Please add a valid email',
],
unique: true,
},
password: {
type: String,
required: [true, 'Please enter a password with a minimum of 6 characters'],
minlength: 6,
select: false
},
avatar: {
type: String,
},
displayName: {
type: String,
required: [true, 'Please add a name to show with your icon'],
unique: true,
},
createDate: {
type: Date,
default: Date.now,
},
updateDate: Date,
role: {
type: String,
enum: ['user', 'admin'],
default: 'user'
},
resetPasswordToken: String,
resetPasswordExpire: Date,
})
UserSchema.pre('save', async function (next) {
if(!this.isModified('password')) next()
this.password = await Bun.password.hash(this.password)
})
UserSchema.pre('save', async function(next) {
if(!this.isModified('email')) next()
this.avatar = await gravatar.url(this.email, {
s: '200',
r: 'pg',
d: 'retro',
})
})
// Sign JWT and return
UserSchema.methods.getSignedJwtToken = function () {
return jwt.sign({ id: this._id }, Bun.env.ACCESS_TOKEN_SECRET, {
expiresIn: Bun.env.JWT_EXPIRE,
})
}
// Match user entered password to hashed password in database
UserSchema.methods.matchPassword = async function (enteredPassword) {
return await Bun.password.verify(enteredPassword, this.password)
}
// Generate and hash password token
UserSchema.methods.getResetPasswordToken = async function () {
// Generate token
const resetToken = crypto.randomBytes(20).toString('hex')
// Hash token and set to resetPasswordToken field
this.resetPasswordToken = crypto
.createHash('sha256')
.update(resetToken)
.digest('hex')
// Set expire
this.resetPasswordExpire = Date.now() + 10 * 60 * 1000
return resetToken
}
export default mongoose.model('User', UserSchema)