2022-02-26 18:16:28 +01:00
|
|
|
import { Injectable, Logger } from '@nestjs/common';
|
2022-02-21 14:53:21 +01:00
|
|
|
import { JwtService } from '@nestjs/jwt';
|
2022-02-28 10:29:40 +01:00
|
|
|
import { instanceToPlain, plainToClass } from 'class-transformer';
|
2022-03-12 20:15:48 +01:00
|
|
|
import { JwtDataDto } from 'picsur-shared/dist/dto/jwt.dto';
|
2022-03-28 15:43:52 +02:00
|
|
|
import { AsyncFailable, Fail } from 'picsur-shared/dist/types';
|
2022-03-19 21:34:33 +01:00
|
|
|
import { strictValidate } from 'picsur-shared/dist/util/validate';
|
2022-03-07 20:19:58 +01:00
|
|
|
import { EUserBackend } from '../../models/entities/user.entity';
|
2022-02-21 14:53:21 +01:00
|
|
|
|
|
|
|
|
@Injectable()
|
2022-03-07 20:19:58 +01:00
|
|
|
export class AuthManagerService {
|
2022-02-26 18:16:28 +01:00
|
|
|
private readonly logger = new Logger('AuthService');
|
|
|
|
|
|
2022-03-12 15:10:22 +01:00
|
|
|
constructor(private jwtService: JwtService) {}
|
2022-02-21 14:53:21 +01:00
|
|
|
|
2022-03-28 15:43:52 +02:00
|
|
|
async createToken(user: EUserBackend): AsyncFailable<string> {
|
2022-02-26 18:16:28 +01:00
|
|
|
const jwtData: JwtDataDto = plainToClass(JwtDataDto, {
|
2022-04-01 12:04:49 +02:00
|
|
|
user,
|
2022-02-26 18:16:28 +01:00
|
|
|
});
|
|
|
|
|
|
2022-03-28 13:44:33 +02:00
|
|
|
// Validate to be sure, this makes client experience better
|
|
|
|
|
// in case of any failures
|
2022-03-19 21:34:33 +01:00
|
|
|
const errors = await strictValidate(jwtData);
|
2022-02-26 18:16:28 +01:00
|
|
|
if (errors.length > 0) {
|
2022-03-28 15:43:52 +02:00
|
|
|
return Fail('Invalid JWT: ' + errors);
|
2022-02-26 18:16:28 +01:00
|
|
|
}
|
2022-02-21 14:53:21 +01:00
|
|
|
|
2022-03-28 15:43:52 +02:00
|
|
|
try {
|
|
|
|
|
return await this.jwtService.signAsync(instanceToPlain(jwtData));
|
|
|
|
|
} catch (e) {
|
|
|
|
|
return Fail("Couldn't create JWT: " + e);
|
|
|
|
|
}
|
2022-02-21 14:53:21 +01:00
|
|
|
}
|
|
|
|
|
}
|