You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.3 KiB
66 lines
2.3 KiB
import {
|
|
Authenticatable,
|
|
AuthenticatableCredentials,
|
|
AuthenticatableIdentifier,
|
|
AuthenticatableRepository,
|
|
} from '../types'
|
|
import {Awaitable, Maybe} from '../../util'
|
|
import {ORMUser} from './ORMUser'
|
|
import {Container, Inject, Injectable} from '../../di'
|
|
import {AuthenticatableAlreadyExistsError} from '../AuthenticatableAlreadyExistsError'
|
|
|
|
/**
|
|
* A user repository implementation that looks up users stored in the database.
|
|
*/
|
|
@Injectable()
|
|
export class ORMUserRepository extends AuthenticatableRepository {
|
|
@Inject('injector')
|
|
protected readonly injector!: Container
|
|
|
|
/** Look up the user by their username. */
|
|
getByIdentifier(id: AuthenticatableIdentifier): Awaitable<Maybe<Authenticatable>> {
|
|
return ORMUser.query<ORMUser>()
|
|
.where('username', '=', id)
|
|
.first()
|
|
}
|
|
|
|
/**
|
|
* Try to look up a user by the credentials provided.
|
|
* If a securityIdentifier is specified, look up the user by username.
|
|
* If username/password are specified, look up the user and verify the password.
|
|
* @param credentials
|
|
*/
|
|
async getByCredentials(credentials: AuthenticatableCredentials): Promise<Maybe<Authenticatable>> {
|
|
if ( !credentials.identifier && credentials.credential ) {
|
|
return ORMUser.query<ORMUser>()
|
|
.where('username', '=', credentials.credential)
|
|
.first()
|
|
}
|
|
|
|
if ( credentials.identifier && credentials.credential ) {
|
|
const user = await ORMUser.query<ORMUser>()
|
|
.where('username', '=', credentials.identifier)
|
|
.first()
|
|
|
|
if ( user && await user.verifyPassword(credentials.credential) ) {
|
|
return user
|
|
}
|
|
}
|
|
}
|
|
|
|
async createByCredentials(credentials: AuthenticatableCredentials): Promise<Authenticatable> {
|
|
if ( await this.getByCredentials(credentials) ) {
|
|
throw new AuthenticatableAlreadyExistsError(`Authenticatable already exists with credentials.`, {
|
|
identifier: credentials.identifier,
|
|
})
|
|
}
|
|
|
|
const user = <ORMUser> this.injector.make(ORMUser)
|
|
user.username = credentials.identifier
|
|
await user.setPassword(credentials.credential)
|
|
await user.save()
|
|
|
|
return user
|
|
}
|
|
}
|