Skip to content

Commit

Permalink
Feature/38405 - simplify SPA queue logic (#1433)
Browse files Browse the repository at this point in the history
* add dev arm templates for service bus

* re-organise

* deploy and add to key vault

* remove obsolete key vault section

* raw output

* separate sb creation from key vault sync

* add queue name to sas token

* complete and working
  • Loading branch information
GuyHarwood authored Dec 5, 2019
1 parent 98c4596 commit 6c78110
Show file tree
Hide file tree
Showing 13 changed files with 27 additions and 56 deletions.
26 changes: 7 additions & 19 deletions admin/services/check-start.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -353,18 +353,9 @@ checkStartService.createPupilCheckPayloads = async function (checkIds, schoolId)
uuid: o.school_uuid
},
tokens: {
checkStarted: {
token: checkStartedSasToken.token,
url: checkStartedSasToken.url
},
pupilPreferences: {
token: pupilPreferencesSasToken.token,
url: pupilPreferencesSasToken.url
},
pupilFeedback: {
token: pupilFeedbackSasToken.token,
url: pupilFeedbackSasToken.url
},
checkStarted: checkStartedSasToken,
pupilPreferences: pupilPreferencesSasToken,
pupilFeedback: pupilFeedbackSasToken,
jwt: {
token: 'token-disabled' // o.pupil_jwtToken
}
Expand All @@ -375,13 +366,10 @@ checkStartService.createPupilCheckPayloads = async function (checkIds, schoolId)
config: pupilConfig
}
if (o.check_isLiveCheck) {
message.tokens.checkComplete = {
token: checkCompleteSasToken.token,
url: checkCompleteSasToken.url
}
message.tokens.checkSubmit = {
token: checkSubmitSasToken.token,
url: checkCompleteSasToken.url
if (featureToggles.isFeatureEnabled('prepareChecksInRedis')) {
message.tokens.checkComplete = checkSubmitSasToken
} else {
message.tokens.checkComplete = checkCompleteSasToken
}
}
messages.push(message)
Expand Down
5 changes: 3 additions & 2 deletions admin/services/sas-token.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const sasTokenService = {
* @param queueName
* @param {Moment} expiryDate
* @param {Object} serviceImplementation
* @return {{token: string, url: string}}
* @return {{token: string, url: string, queueName: string}}
*/
generateSasToken: function (queueName, expiryDate, serviceImplementation) {
if (!serviceImplementation) {
Expand Down Expand Up @@ -51,7 +51,8 @@ const sasTokenService = {

return {
token: sasToken,
url: serviceImplementation.getUrl(queueName)
url: serviceImplementation.getUrl(queueName),
queueName: queueName
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions admin/spec/back-end/service/check-start.service.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,8 @@ describe('check-start.service', () => {
spyOn(sasTokenService, 'generateSasToken').and.callFake((s) => {
return {
token: '<someToken',
url: `http://localhost/${s}`
url: `http://localhost/${s}`,
queueName: 'abc'
}
})
spyOn(checkFormService, 'prepareQuestionData').and.callThrough()
Expand Down Expand Up @@ -310,7 +311,6 @@ describe('check-start.service', () => {
const res = await checkStartService.createPupilCheckPayloads([1], 1)
expect(sasTokenService.generateSasToken).toHaveBeenCalledTimes(5)
expect(Object.keys(res[0].tokens)).toContain('checkComplete')
expect(Object.keys(res[0].tokens)).toContain('checkSubmit')
})
})
describe('when familiarisation checks are generated', () => {
Expand Down
1 change: 1 addition & 0 deletions admin/spec/back-end/service/sas-token.service.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ describe('sas-token.service', () => {
expect(queueServiceMock.getUrl).toHaveBeenCalled()
expect({}.hasOwnProperty.call(res, 'token')).toBe(true)
expect({}.hasOwnProperty.call(res, 'url')).toBe(true)
expect({}.hasOwnProperty.call(res, 'queueName')).toBe(true)
})

it('sets the permissions to add only', () => {
Expand Down
6 changes: 0 additions & 6 deletions pupil-spa/src/app/services/azure-queue/queue-names.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { Router } from '@angular/router';
import { AuditService } from '../audit/audit.service';
import { AzureQueueService } from '../azure-queue/azure-queue.service';
import { CheckCompleteService } from './check-complete.service';
import { AppConfigService, loadConfigMockService, IAppConfig } from '../config/config.service';
import { AppConfigService, loadConfigMockService } from '../config/config.service';
import { StorageService } from '../storage/storage.service';
import { TestBed } from '@angular/core/testing';
import { TokenService } from '../token/token.service';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { StorageService } from '../storage/storage.service';
import { TokenService } from '../token/token.service';
import { queueNames } from '../azure-queue/queue-names';
import { AppUsageService } from '../app-usage/app-usage.service';
import { CompressorService } from '../compressor/compressor.service';

Expand All @@ -23,7 +22,6 @@ export class CheckCompleteService {
checkSubmissionApiErrorDelay;
checkSubmissionAPIErrorMaxAttempts;
submissionPendingViewMinDisplay;
submitsToCheckReceiver: boolean;

constructor(private auditService: AuditService,
private azureQueueService: AzureQueueService,
Expand All @@ -34,13 +32,11 @@ export class CheckCompleteService {
const {
checkSubmissionApiErrorDelay,
checkSubmissionAPIErrorMaxAttempts,
submissionPendingViewMinDisplay,
submitsToCheckReceiver
submissionPendingViewMinDisplay
} = APP_CONFIG;
this.checkSubmissionApiErrorDelay = checkSubmissionApiErrorDelay;
this.checkSubmissionAPIErrorMaxAttempts = checkSubmissionAPIErrorMaxAttempts;
this.submissionPendingViewMinDisplay = submissionPendingViewMinDisplay;
this.submitsToCheckReceiver = submitsToCheckReceiver;
}

/**
Expand All @@ -64,9 +60,7 @@ export class CheckCompleteService {
if (config.practice) {
return this.onSuccess(startTime);
}
const queueName = queueNames.checkComplete;
const {url, token} = this.submitsToCheckReceiver ? this.tokenService.getToken('checkSubmit')
: this.tokenService.getToken('checkComplete');
const {url, token, queueName} = this.tokenService.getToken('checkComplete');
const retryConfig = {
errorDelay: this.checkSubmissionApiErrorDelay,
errorMaxAttempts: this.checkSubmissionAPIErrorMaxAttempts
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import { AzureQueueService } from '../azure-queue/azure-queue.service';
import { AuditService } from '../audit/audit.service';
import { StorageService } from '../storage/storage.service';
import { TokenService } from '../token/token.service';
import { queueNames } from '../azure-queue/queue-names';

/**
* Declaration of check start service
Expand Down Expand Up @@ -37,8 +36,7 @@ export class CheckStartService {
* @returns {Promise.<void>}
*/
public async submit(): Promise<void> {
const queueName = queueNames.checkStarted;
const { url, token } = this.tokenService.getToken('checkStarted');
const { url, token, queueName } = this.tokenService.getToken('checkStarted');
// Create a model for the payload
const payload = this.storageService.getItem('pupil');
payload.clientCheckStartedAt = new Date();
Expand Down
4 changes: 1 addition & 3 deletions pupil-spa/src/app/services/feedback/feedback.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { APP_CONFIG } from '../config/config.service';
import { StorageService } from '../storage/storage.service';
import { TokenService } from '../token/token.service';
import { AzureQueueService } from '../azure-queue/azure-queue.service';
import { queueNames } from '../azure-queue/queue-names';

@Injectable()
export class FeedbackService {
Expand Down Expand Up @@ -49,8 +48,7 @@ export class FeedbackService {
* @returns {Promise.<void>}
*/
async queueSubmit(payload) {
const queueName = queueNames.pupilFeedback;
const { url, token } = this.tokenService.getToken('pupilFeedback');
const { url, token, queueName } = this.tokenService.getToken('pupilFeedback');
// Create a model for the payload
const retryConfig = {
errorDelay: this.feedbackAPIErrorDelay,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import { AuditService } from '../audit/audit.service';
import { QuestionService } from '../question/question.service';
import { QuestionServiceMock } from '../question/question.service.mock';
import { StorageServiceMock } from '../storage/storage.service.mock';
import { queueNames } from '../azure-queue/queue-names';
import { AccessArrangements } from '../../access-arrangements';

let azureQueueService: AzureQueueService;
Expand Down Expand Up @@ -59,7 +58,7 @@ describe('PupilPrefsService', () => {
it('should call pupil prefs azure queue storage', async () => {
const pupil = { checkCode: 'checkCode' };
spyOn(mockQuestionService, 'getConfig').and.returnValue({colourContrast: false});
spyOn(tokenService, 'getToken').and.returnValue({url: 'url', token: 'token'});
spyOn(tokenService, 'getToken').and.returnValue({url: 'url', token: 'token', queueName: 'the-queue'});
const addMessageSpy = spyOn(azureQueueService, 'addMessage');
const addEntrySpy = spyOn(auditService, 'addEntry');
spyOn(mockStorageService, 'setItem');
Expand All @@ -80,7 +79,7 @@ describe('PupilPrefsService', () => {
errorDelay: pupilPrefsService.pupilPrefsAPIErrorDelay,
errorMaxAttempts: pupilPrefsService.pupilPrefsAPIErrorMaxAttempts
};
expect(addMessageSpy.calls.all()[0].args[0]).toEqual(queueNames.pupilPreferences);
expect(addMessageSpy.calls.all()[0].args[0]).toEqual('the-queue');
expect(addMessageSpy.calls.all()[0].args[1]).toEqual('url');
expect(addMessageSpy.calls.all()[0].args[2]).toEqual('token');
expect(addMessageSpy.calls.all()[0].args[3]).toEqual(payload);
Expand All @@ -89,7 +88,7 @@ describe('PupilPrefsService', () => {
});
it('should audit log the error when azureQueueService add Message fails', async () => {
spyOn(mockQuestionService, 'getConfig').and.returnValue({colourContrast: false});
spyOn(tokenService, 'getToken').and.returnValue({url: 'url', token: 'token'});
spyOn(tokenService, 'getToken').and.returnValue({url: 'url', token: 'token', queueName: 'the-queue'});
spyOn(azureQueueService, 'addMessage').and.returnValue(Promise.reject(new Error('error')));
const addEntrySpy = spyOn(auditService, 'addEntry');
spyOn(mockStorageService, 'getItem').and.returnValue(storedPrefs);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { APP_CONFIG } from '../config/config.service';
import { AzureQueueService } from '../azure-queue/azure-queue.service';
import { StorageService } from '../storage/storage.service';
import { TokenService } from '../token/token.service';
import { queueNames } from '../azure-queue/queue-names';
import { accessArrangementsDataKey, AccessArrangementsConfig, AccessArrangements } from '../../access-arrangements';
import { Pupil } from '../../pupil';
import { AuditService } from '../audit/audit.service';
Expand Down Expand Up @@ -37,8 +36,7 @@ export class PupilPrefsService {
const fontSetting = this.fontSettings.find(f => f.val === accessArrangements.fontSize);
const contrastSetting = this.contrastSettings.find(f => f.val === accessArrangements.contrast);
const pupil = this.storageService.getItem('pupil') as Pupil;
const queueName = queueNames.pupilPreferences;
const {url, token} = this.tokenService.getToken('pupilPreferences');
const {url, token, queueName} = this.tokenService.getToken('pupilPreferences');
const retryConfig = {
errorDelay: this.pupilPrefsAPIErrorDelay,
errorMaxAttempts: this.pupilPrefsAPIErrorMaxAttempts
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import Moment from 'moment'
import * as az from '../../azure/storage-helper'
const tableService = new az.AsyncTableService()

class V3 {
class CheckReceiver {
async process (context: Context, receivedCheck: SubmittedCheckMessageV3) {
const receivedCheckEntity: ReceivedCheck = {
PartitionKey: receivedCheck.schoolUUID,
Expand All @@ -24,4 +24,4 @@ class V3 {
}
}

export default new V3()
export default new CheckReceiver()
6 changes: 3 additions & 3 deletions tslib/src/functions/check-receiver/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,18 @@ import { AzureFunction, Context } from '@azure/functions'
import * as schemas from '../../schemas/models'
import { performance } from 'perf_hooks'
const functionName = 'check-receiver'
import V3 from './v3'
import CheckReceiver from './check-receiver'

const queueTrigger: AzureFunction = async function (context: Context, submittedCheck: schemas.SubmittedCheckMessageV3): Promise<void> {
const start = performance.now()
const version = submittedCheck.version
context.log.info(`${functionName}: version:${version} message received for checkCode ${submittedCheck.checkCode}`)
try {
if (version !== 3) {
if (version !== 2) {
// dead letter the message as we no longer support below v3
throw new Error(`Message schema version:${version} unsupported`)
}
await V3.process(context, submittedCheck)
await CheckReceiver.process(context, submittedCheck)
} catch (error) {
context.log.error(`${functionName}: ERROR: ${error.message}`)
throw error
Expand Down

0 comments on commit 6c78110

Please sign in to comment.