Files
standardnotes-server/packages/auth/src/Controller/AdminController.ts
T
Karol Sójko 3aef5998df feat: sqlite driver for auth service (#572)
* wip: initial sqlite bootstrap

* wip: switch to sqlite3 as default db type

* wip: boilerplate data

* fix(auth): case sensitive register and login

* fix(auth): refactor username validations

* fix(auth): allow changing username to both username and email:

* fix(auth): lock middleware for recovery log in

* fix(domain-core): specs for invalid types

* fix(auth): lock middleware specs

* fix(auth): typeorm code arrangements

* fix: running e2e on both mysql and sqlite in ci
2023-04-27 11:17:01 +02:00

129 lines
3.7 KiB
TypeScript

import { Username } from '@standardnotes/domain-core'
import { SettingName } from '@standardnotes/settings'
import { Request } from 'express'
import { inject } from 'inversify'
import {
BaseHttpController,
controller,
httpDelete,
httpGet,
httpPost,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
results,
} from 'inversify-express-utils'
import TYPES from '../Bootstrap/Types'
import { CreateOfflineSubscriptionToken } from '../Domain/UseCase/CreateOfflineSubscriptionToken/CreateOfflineSubscriptionToken'
import { CreateSubscriptionToken } from '../Domain/UseCase/CreateSubscriptionToken/CreateSubscriptionToken'
import { DeleteSetting } from '../Domain/UseCase/DeleteSetting/DeleteSetting'
import { UserRepositoryInterface } from '../Domain/User/UserRepositoryInterface'
@controller('/admin')
export class AdminController extends BaseHttpController {
constructor(
@inject(TYPES.DeleteSetting) private doDeleteSetting: DeleteSetting,
@inject(TYPES.UserRepository) private userRepository: UserRepositoryInterface,
@inject(TYPES.CreateSubscriptionToken) private createSubscriptionToken: CreateSubscriptionToken,
@inject(TYPES.CreateOfflineSubscriptionToken)
private createOfflineSubscriptionToken: CreateOfflineSubscriptionToken,
) {
super()
}
@httpGet('/user/:email')
async getUser(request: Request): Promise<results.JsonResult> {
const usernameOrError = Username.create(request.params.email ?? '')
if (usernameOrError.isFailed()) {
return this.json(
{
error: {
message: 'Missing email parameter.',
},
},
400,
)
}
const username = usernameOrError.getValue()
const user = await this.userRepository.findOneByUsernameOrEmail(username)
if (!user) {
return this.json(
{
error: {
message: `No user with email '${username.value}'.`,
},
},
400,
)
}
return this.json({
uuid: user.uuid,
})
}
@httpDelete('/users/:userUuid/mfa')
async deleteMFASetting(request: Request): Promise<results.JsonResult> {
const { userUuid } = request.params
const { uuid, updatedAt } = request.body
const result = await this.doDeleteSetting.execute({
uuid,
userUuid,
settingName: SettingName.NAMES.MfaSecret,
timestamp: updatedAt,
softDelete: true,
})
if (result.success) {
return this.json(result)
}
return this.json(result, 400)
}
@httpPost('/users/:userUuid/subscription-token')
async createToken(request: Request): Promise<results.JsonResult> {
const { userUuid } = request.params
const result = await this.createSubscriptionToken.execute({
userUuid,
})
return this.json({
token: result.subscriptionToken.token,
})
}
@httpPost('/users/:email/offline-subscription-token')
async createOfflineToken(request: Request): Promise<results.JsonResult | results.BadRequestResult> {
const { email } = request.params
const result = await this.createOfflineSubscriptionToken.execute({
userEmail: email,
})
if (!result.success) {
return this.badRequest()
}
return this.json({
token: result.offlineSubscriptionToken.token,
})
}
@httpPost('/users/:userUuid/email-backups')
async disableEmailBackups(request: Request): Promise<results.BadRequestErrorMessageResult | results.OkResult> {
const { userUuid } = request.params
const result = await this.doDeleteSetting.execute({
userUuid,
settingName: SettingName.NAMES.EmailBackupFrequency,
})
if (result.success) {
return this.ok()
}
return this.badRequest('No email backups found')
}
}