feat(auth): add endpoint for generating offline subscription tokens for admin panel

This commit is contained in:
Karol Sójko
2022-08-12 13:12:55 +02:00
parent fba6cfd62c
commit c61b615da6
19 changed files with 57 additions and 2 deletions
@@ -327,7 +327,7 @@ endif
quiet_cmd_regen_makefile = ACTION Regenerating $@
cmd_regen_makefile = cd $(srcdir); /Users/karolsojko/workspace/server/.yarn/unplugged/node-gyp-npm-9.0.0-0eccfca4d1/node_modules/node-gyp/gyp/gyp_main.py -fmake --ignore-environment "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/Users/karolsojko/Library/Caches/node-gyp/16.15.1" "-Dnode_gyp_dir=/Users/karolsojko/workspace/server/.yarn/unplugged/node-gyp-npm-9.0.0-0eccfca4d1/node_modules/node-gyp" "-Dnode_lib_file=/Users/karolsojko/Library/Caches/node-gyp/16.15.1/<(target_arch)/node.lib" "-Dmodule_root_dir=/Users/karolsojko/workspace/server/.yarn/unplugged/@newrelic-native-metrics-npm-9.0.0-590d2e713a/node_modules/@newrelic/native-metrics" "-Dnode_engine=v8" "--depth=." "-Goutput_dir=." "--generator-output=build" -I/Users/karolsojko/workspace/server/.yarn/unplugged/@newrelic-native-metrics-npm-9.0.0-590d2e713a/node_modules/@newrelic/native-metrics/build/config.gypi -I/Users/karolsojko/workspace/server/.yarn/unplugged/node-gyp-npm-9.0.0-0eccfca4d1/node_modules/node-gyp/addon.gypi -I/Users/karolsojko/Library/Caches/node-gyp/16.15.1/include/node/common.gypi "--toplevel-dir=." binding.gyp
Makefile: $(srcdir)/binding.gyp $(srcdir)/../../../../../../../../Library/Caches/node-gyp/16.15.1/include/node/common.gypi $(srcdir)/build/config.gypi $(srcdir)/../../../../node-gyp-npm-9.0.0-0eccfca4d1/node_modules/node-gyp/addon.gypi
Makefile: $(srcdir)/binding.gyp $(srcdir)/../../../../node-gyp-npm-9.0.0-0eccfca4d1/node_modules/node-gyp/addon.gypi $(srcdir)/../../../../../../../../Library/Caches/node-gyp/16.15.1/include/node/common.gypi $(srcdir)/build/config.gypi
$(call do_cmd,regen_makefile)
# "all" is a concatenation of the "all" targets from all the included
@@ -7,15 +7,18 @@ import { UserRepositoryInterface } from '../Domain/User/UserRepositoryInterface'
import * as express from 'express'
import { DeleteSetting } from '../Domain/UseCase/DeleteSetting/DeleteSetting'
import { CreateSubscriptionToken } from '../Domain/UseCase/CreateSubscriptionToken/CreateSubscriptionToken'
import { CreateOfflineSubscriptionToken } from '../Domain/UseCase/CreateOfflineSubscriptionToken/CreateOfflineSubscriptionToken'
describe('AdminController', () => {
let deleteSetting: DeleteSetting
let userRepository: UserRepositoryInterface
let createSubscriptionToken: CreateSubscriptionToken
let createOfflineSubscriptionToken: CreateOfflineSubscriptionToken
let request: express.Request
let user: User
const createController = () => new AdminController(deleteSetting, userRepository, createSubscriptionToken)
const createController = () =>
new AdminController(deleteSetting, userRepository, createSubscriptionToken, createOfflineSubscriptionToken)
beforeEach(() => {
user = {} as jest.Mocked<User>
@@ -34,6 +37,14 @@ describe('AdminController', () => {
},
})
createOfflineSubscriptionToken = {} as jest.Mocked<CreateOfflineSubscriptionToken>
createOfflineSubscriptionToken.execute = jest.fn().mockReturnValue({
success: true,
offlineSubscriptionToken: {
token: '123-sub-token',
},
})
request = {
headers: {},
body: {},
@@ -125,6 +136,31 @@ describe('AdminController', () => {
expect(await result.content.readAsStringAsync()).toEqual('{"token":"123-sub-token"}')
})
it("should return a new offline subscription token for the user's email", async () => {
request.params.email = '[email protected]'
const httpResponse = await createController().createOfflineToken(request)
const result = await httpResponse.executeAsync()
expect(httpResponse).toBeInstanceOf(results.JsonResult)
expect(result.statusCode).toBe(200)
expect(await result.content.readAsStringAsync()).toEqual('{"token":"123-sub-token"}')
})
it('should not return a new offline subscription token if the workflow fails', async () => {
request.params.email = '[email protected]'
createOfflineSubscriptionToken.execute = jest.fn().mockReturnValue({ success: false })
const httpResponse = await createController().createOfflineToken(request)
const result = await httpResponse.executeAsync()
expect(httpResponse).toBeInstanceOf(results.BadRequestResult)
expect(result.statusCode).toBe(400)
})
it('should not delete email backup setting if value is null', async () => {
request.body = {}
request.params = {
@@ -11,6 +11,7 @@ import {
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'
@@ -21,6 +22,8 @@ export class AdminController extends BaseHttpController {
@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()
}
@@ -90,6 +93,22 @@ export class AdminController extends BaseHttpController {
})
}
@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