|
@@ -0,0 +1,50 @@
|
|
|
|
+import { Injectable } from '@nestjs/common';
|
|
|
|
+import { InjectModel } from '@nestjs/mongoose';
|
|
|
|
+import { randomBytes } from 'crypto';
|
|
|
|
+import { Model } from 'mongoose';
|
|
|
|
+import { UserDocument, User } from './models/user.model';
|
|
|
|
+
|
|
|
|
+const ApiKeyLength = 64;
|
|
|
|
+
|
|
|
|
+@Injectable()
|
|
|
|
+export class UserService {
|
|
|
|
+ constructor(
|
|
|
|
+ @InjectModel('user')
|
|
|
|
+ private readonly userModel: Model<UserDocument>,
|
|
|
|
+ ) {}
|
|
|
|
+
|
|
|
|
+ private static createApiKey(): string {
|
|
|
|
+ return randomBytes(ApiKeyLength).toString('hex');
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ async register(vatsimId: number, fullName: string): Promise<User> {
|
|
|
|
+ return this.user(vatsimId).then((user) => {
|
|
|
|
+ if (user) return user;
|
|
|
|
+
|
|
|
|
+ return this.userModel
|
|
|
|
+ .create({
|
|
|
|
+ vatsimId,
|
|
|
|
+ apiCode: UserService.createApiKey(),
|
|
|
|
+ systemAdminAccess: false,
|
|
|
|
+ airportAdminAccess: [],
|
|
|
|
+ fullName,
|
|
|
|
+ })
|
|
|
|
+ .then(() => this.user(vatsimId));
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ async user(vatsimId: number): Promise<User | undefined> {
|
|
|
|
+ return this.userModel.findOne({ vatsimId });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ async refreshApiKey(vatsimId: number): Promise<User | undefined> {
|
|
|
|
+ return this.userModel
|
|
|
|
+ .findOneAndUpdate({ vatsimId }, { apiCode: UserService.createApiKey() })
|
|
|
|
+ .then(() =>
|
|
|
|
+ this.user(vatsimId).then((user) => {
|
|
|
|
+ if (!user) return undefined;
|
|
|
|
+ return user;
|
|
|
|
+ }),
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+}
|