Skip to content

Commit 927109b

Browse files
authored
Merge branch 'develop' into 1465-reduce-logging-level-for-expired-token
2 parents c641b3e + 023e343 commit 927109b

121 files changed

Lines changed: 3142 additions & 813 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/test-build.yml

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,18 @@ jobs:
214214
JWT_TOKEN_LIFE: 7d
215215
SPARKPOST_TOKEN: wrong_token_for_test
216216

217+
- name: Cache backend build
218+
uses: actions/cache@v4
219+
with:
220+
path: apps/backend/build
221+
key: backend-build-${{ github.sha }}-${{ github.run_id }}
222+
223+
- name: Cache frontend build
224+
uses: actions/cache@v4
225+
with:
226+
path: apps/frontend/build
227+
key: frontend-build-${{ github.sha }}-${{ github.run_id }}
228+
217229
test_backend:
218230
runs-on: ubuntu-latest
219231
needs: build
@@ -273,13 +285,15 @@ jobs:
273285
- id: p-am
274286
files: cypress/e2e/p[a-m]*.ts
275287
- id: p-nz
276-
files: cypress/e2e/p[n-z]*.ts
288+
files: cypress/e2e/p[n-z]!(oposals)*.ts
289+
- id: proposals
290+
files: cypress/e2e/proposals*.ts
277291
- id: rs
278292
files: cypress/e2e/[r-s]*.ts
279293
- id: t
280-
files: cypress/e2e/t!(emplateDeleteAndArchive).ts
294+
files: cypress/e2e/t!(emplatesBasic).ts
281295
- id: templateDelete
282-
files: cypress/e2e/templateDeleteAndArchive*.ts
296+
files: cypress/e2e/templatesBasic*.ts
283297
- id: uz
284298
files: cypress/e2e/[u-z]*.ts
285299
- id: AZ
@@ -331,6 +345,18 @@ jobs:
331345
${{ env.FRONTEND_SDK_KEY }}
332346
sdk-frontend-
333347
348+
- name: Restore backend build
349+
uses: actions/cache@v4
350+
with:
351+
path: apps/backend/build
352+
key: backend-build-${{ github.sha }}-${{ github.run_id }}
353+
354+
- name: Restore frontend build
355+
uses: actions/cache@v4
356+
with:
357+
path: apps/frontend/build
358+
key: frontend-build-${{ github.sha }}-${{ github.run_id }}
359+
334360
# TODO: See how to proceed with e2e caching because there is some error:
335361
# - You're caching 'node_modules' but are not caching this path: /home/runner/.cache/Cypress
336362
# - You ran 'npm install' at an earlier build step but did not persist: /home/runner/.cache/Cypress
@@ -397,7 +423,7 @@ jobs:
397423
run: |
398424
REPO_DIR_NAME=$(basename $GITHUB_WORKSPACE)
399425
400-
npm run e2e:after:dev:stfc
426+
npm run e2e:after:start:stfc
401427
402428
- name: Run e2e tests
403429
env:
@@ -436,7 +462,7 @@ jobs:
436462
run: |
437463
REPO_DIR_NAME=$(basename $GITHUB_WORKSPACE)
438464
439-
npm run e2e:after:dev -- --dns-result-order=ipv4first
465+
npm run e2e:after:start -- --dns-result-order=ipv4first
440466
441467
- name: Upload cypres screenshots
442468
if: failure()
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
DO
2+
$$
3+
BEGIN
4+
IF register_patch(
5+
'AddVisitRegistrationClaim.sql',
6+
'Jekabs Karklins',
7+
'Adding table to store visit registration claims',
8+
'2025-06-04'
9+
) THEN
10+
BEGIN
11+
-- Create the visit_registration_claims table
12+
CREATE TABLE IF NOT EXISTS visit_registration_claims (
13+
invite_id INT NOT NULL,
14+
visit_id INT NOT NULL,
15+
FOREIGN KEY (invite_id) REFERENCES invites(invite_id) ON DELETE CASCADE,
16+
FOREIGN KEY (visit_id) REFERENCES visits(visit_id) ON DELETE CASCADE,
17+
UNIQUE (invite_id, visit_id)
18+
);
19+
20+
ALTER TABLE visit_registration_claims ADD CONSTRAINT visit_registration_unique
21+
UNIQUE (invite_id, visit_id);
22+
END;
23+
END IF;
24+
END;
25+
$$
26+
LANGUAGE plpgsql;
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
DO
2+
$$
3+
BEGIN
4+
IF register_patch('ChangeFapGradeToString.sql', 'TCMeldrum', 'Make grade a string for FAPs', '2025-09-04') THEN
5+
BEGIN
6+
7+
DROP VIEW review_data;
8+
9+
ALTER TABLE fap_reviews
10+
ALTER COLUMN grade type varchar(30);
11+
12+
CREATE OR REPLACE VIEW public.review_data
13+
AS SELECT proposal.proposal_pk,
14+
proposal.proposal_id,
15+
proposal.title,
16+
proposal.instrument_name,
17+
proposal.availability_time,
18+
proposal.time_allocation,
19+
proposal.fap_id,
20+
proposal.rank_order,
21+
proposal.call_id,
22+
proposal.proposer_id,
23+
proposal.instrument_id,
24+
proposal.fap_time_allocation,
25+
proposal.questionary_id,
26+
grade.avg AS average_grade,
27+
proposal.public_comment AS comment
28+
FROM ( SELECT fp.proposal_pk,
29+
p.proposal_id,
30+
p.title,
31+
i.name AS instrument_name,
32+
chi.availability_time,
33+
tr.time_allocation,
34+
f.fap_id,
35+
fmd.rank_order,
36+
c.call_id,
37+
p.proposer_id,
38+
i.instrument_id,
39+
fp.fap_time_allocation,
40+
p.questionary_id,
41+
tr.public_comment
42+
FROM fap_proposals fp
43+
JOIN faps f ON f.fap_id = fp.fap_id
44+
JOIN call c ON c.call_id = fp.call_id
45+
JOIN proposals p ON p.proposal_pk = fp.proposal_pk
46+
JOIN technical_review tr ON tr.proposal_pk = p.proposal_pk AND tr.instrument_id = fp.instrument_id
47+
LEFT JOIN fap_meeting_decisions fmd ON fmd.proposal_pk = p.proposal_pk
48+
JOIN call_has_instruments chi ON chi.instrument_id = fp.instrument_id AND chi.call_id = c.call_id
49+
JOIN instruments i ON i.instrument_id = chi.instrument_id
50+
WHERE p.status_id <> 9 AND p.status_id <> 1) proposal
51+
LEFT JOIN ( SELECT fr.proposal_pk,
52+
avg(CASE
53+
WHEN fr.grade ~ '^\d+(\.\d+)\?$' THEN fr.grade::double precision
54+
ELSE NULL
55+
END) AS avg
56+
FROM fap_proposals fp
57+
JOIN fap_reviews fr ON fr.proposal_pk = fp.proposal_pk
58+
GROUP BY fr.proposal_pk) grade ON grade.proposal_pk = proposal.proposal_pk;
59+
60+
61+
UPDATE questions SET default_config = jsonb_set(default_config, '{maxGrade}', '10', true) WHERE question_id = 'fap_review_basis';
62+
UPDATE questions SET default_config = jsonb_set(default_config, '{minGrade}', '1', true) WHERE question_id = 'fap_review_basis';
63+
UPDATE questions SET default_config = jsonb_set(default_config, '{decimalPoints}', '0', true) WHERE question_id = 'fap_review_basis';
64+
UPDATE templates_has_questions SET config = jsonb_set(config, '{maxGrade}', '10', true) WHERE question_id = 'fap_review_basis';
65+
UPDATE templates_has_questions SET config = jsonb_set(config, '{minGrade}', '1', true) WHERE question_id = 'fap_review_basis';
66+
UPDATE templates_has_questions SET config = jsonb_set(config, '{decimalPoints}', '0', true) WHERE question_id = 'fap_review_basis';
67+
68+
DELETE FROM settings WHERE settings_id = 'GRADE_PRECISION';
69+
END;
70+
END IF;
71+
END;
72+
$$
73+
LANGUAGE plpgsql;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
DO
2+
$$
3+
BEGIN
4+
IF register_patch('Update_email_search_description.sql', 'jekabskarklins', 'Updates email search description to make it more clear.', '2025-09-09') THEN
5+
BEGIN
6+
UPDATE features
7+
SET description = 'By setting this feature ON, users can be searched *only* by their exact email addresses.'
8+
WHERE feature_id = 'EMAIL_SEARCH';
9+
END;
10+
END IF;
11+
END;
12+
$$
13+
LANGUAGE plpgsql;

apps/backend/db_patches/db_seeds/0005_ProposalQuestions.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ INSERT INTO templates_has_questions(
389389
VALUES
390390
(
391391
'dynamic_multiple_choice_question',
392-
proposal_template_id_var, proposal_topic_id_var, 6, '{"variant":"dropdown", "url":"", "jsonPath":"","isMultipleSelect":true, "apiCallRequestHeaders":[],"readPermissions":[]}'
392+
proposal_template_id_var, proposal_topic_id_var, 10, '{"variant":"dropdown", "url":"", "jsonPath":"","isMultipleSelect":true, "apiCallRequestHeaders":[],"readPermissions":[]}'
393393
);
394394
INSERT INTO answers(
395395
questionary_id, question_id, answer
@@ -456,7 +456,7 @@ INSERT INTO templates_has_questions(
456456
VALUES
457457
(
458458
'instrument_picker_question',
459-
proposal_template_id_var, proposal_topic_id_var, 6, '{"variant":"dropdown","options":[1, 2], "readPermissions":[]}'
459+
proposal_template_id_var, proposal_topic_id_var, 11, '{"variant":"dropdown","options":[1, 2], "readPermissions":[]}'
460460
);
461461
INSERT INTO answers(
462462
questionary_id, question_id, answer
@@ -491,7 +491,7 @@ INSERT INTO templates_has_questions(
491491
VALUES
492492
(
493493
'technique_picker_question',
494-
proposal_template_id_var, proposal_topic_id_var, 6, '{"variant":"dropdown","options":[1, 2], "readPermissions":[]}'
494+
proposal_template_id_var, proposal_topic_id_var, 12, '{"variant":"dropdown","options":[1, 2], "readPermissions":[]}'
495495
);
496496
INSERT INTO answers(
497497
questionary_id, question_id, answer

apps/backend/package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/backend/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
"tsc": "tsc",
1919
"build": "npm run generate:uows && rm -rf ./build && tsc",
2020
"dev": "docker compose up -d --remove-orphans && ts-node-dev -r tsconfig-paths/register --respawn -T ./index.ts",
21-
"dev:e2e": "docker compose -f docker-compose.e2e.yml up -d --remove-orphans && wait-on --verbose --interval 5000 --delay 15000 --timeout 300000 tcp:5432 && ts-node -r tsconfig-paths/register -T ./index.ts",
22-
"dev:e2e:stfc": "docker compose -f docker-compose-stfc.e2e.yml up -d --remove-orphans && wait-on --verbose --interval 5000 --delay 15000 --timeout 300000 tcp:5432 && ts-node -r tsconfig-paths/register -T ./index.ts",
21+
"start:e2e": "docker compose -f docker-compose.e2e.yml up -d --remove-orphans && wait-on --verbose --interval 5000 --delay 15000 --timeout 300000 tcp:5432 && node ./build/index.js",
22+
"start:e2e:stfc": "docker compose -f docker-compose-stfc.e2e.yml up -d --remove-orphans && wait-on --verbose --interval 5000 --delay 15000 --timeout 300000 tcp:5432 && node ./build/index.js",
2323
"dev:docker": "npm install && ts-node-dev --inspect=0.0.0.0:9229 --respawn -T ./index.ts",
2424
"prod": "tsc && node ./build/index.js",
2525
"lint": "npm run generate:uows && tsc --noEmit && eslint . --ext .js,.ts --quiet",
@@ -47,7 +47,7 @@
4747
"@user-office-software/duo-localisation": "^1.2.0",
4848
"@user-office-software/duo-logger": "^2.3.2",
4949
"@user-office-software/duo-message-broker": "^1.6.0",
50-
"@user-office-software/duo-validation": "^5.1.19",
50+
"@user-office-software/duo-validation": "^5.1.20",
5151
"@user-office-software/openid": "^1.4.0",
5252
"await-to-js": "^2.1.1",
5353
"bcryptjs": "^2.4.3",
@@ -129,4 +129,4 @@
129129
"npm": ">=10.9.2",
130130
"node": ">=22.0.0"
131131
}
132-
}
132+
}

apps/backend/src/config/Tokens.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,11 @@ export const Tokens = {
4242
UnitDataSource: Symbol('UnitDataSource'),
4343
UserAuthorization: Symbol('UserAuthorization'),
4444
ProposalAuthorization: Symbol('ProposalAuthorization'),
45+
VisitAuthorization: Symbol('VisitAuthorization'),
4546
VisitRegistrationAuthorization: Symbol('VisitRegistrationAuthorization'),
4647
UserDataSource: Symbol('UserDataSource'),
4748
VisitDataSource: Symbol('VisitDataSource'),
49+
VisitRegistrationClaimDataSource: Symbol('VisitRegistrationClaimDataSource'),
4850
PredefinedMessageDataSource: Symbol('PredefinedMessageDataSource'),
4951
InternalReviewDataSource: Symbol('InternalReviewDataSource'),
5052
FapDataColumns: Symbol('FapDataColumns'),

apps/backend/src/config/dependencyConfigDefault.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'reflect-metadata';
88
import { DataAccessUsersAuthorization } from '../auth/DataAccessUsersAuthorization';
99
import { OAuthAuthorization } from '../auth/OAuthAuthorization';
1010
import { ProposalAuthorization } from '../auth/ProposalAuthorization';
11+
import { VisitAuthorization } from '../auth/VisitAuthorization';
1112
import { VisitRegistrationAuthorization } from '../auth/VisitRegistrationAuthorization';
1213
import { PostgresAdminDataSourceWithAutoUpgrade } from '../datasources/postgres/AdminDataSource';
1314
import PostgresCallDataSource from '../datasources/postgres/CallDataSource';
@@ -43,6 +44,7 @@ import PostgresTemplateDataSource from '../datasources/postgres/TemplateDataSour
4344
import PostgresUnitDataSource from '../datasources/postgres/UnitDataSource';
4445
import PostgresUserDataSource from '../datasources/postgres/UserDataSource';
4546
import PostgresVisitDataSource from '../datasources/postgres/VisitDataSource';
47+
import PostgresVisitRegistrationClaimDataSource from '../datasources/postgres/VisitRegistrationClaimDataSource';
4648
import PostgresWorkflowDataSource from '../datasources/postgres/WorkflowDataSource';
4749
import { createSkipLoggingHandler } from '../eventHandlers/logging';
4850
import { SkipSendMailService } from '../eventHandlers/MailService/SkipSendMailService';
@@ -106,6 +108,11 @@ mapClass(Tokens.TemplateDataSource, PostgresTemplateDataSource);
106108
mapClass(Tokens.UnitDataSource, PostgresUnitDataSource);
107109
mapClass(Tokens.UserDataSource, PostgresUserDataSource);
108110
mapClass(Tokens.VisitDataSource, PostgresVisitDataSource);
111+
mapClass(
112+
Tokens.VisitRegistrationClaimDataSource,
113+
PostgresVisitRegistrationClaimDataSource
114+
);
115+
mapClass(Tokens.VisitAuthorization, VisitAuthorization);
109116
mapClass(Tokens.VisitRegistrationAuthorization, VisitRegistrationAuthorization);
110117
mapClass(Tokens.TechniqueDataSource, PostgresTechniqueDataSource);
111118
mapClass(

apps/backend/src/config/dependencyConfigE2E.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'reflect-metadata';
44
import { DataAccessUsersAuthorization } from '../auth/DataAccessUsersAuthorization';
55
import { OAuthAuthorization } from '../auth/OAuthAuthorization';
66
import { ProposalAuthorization } from '../auth/ProposalAuthorization';
7+
import { VisitAuthorization } from '../auth/VisitAuthorization';
78
import { VisitRegistrationAuthorization } from '../auth/VisitRegistrationAuthorization';
89
import PostgresAdminDataSource from '../datasources/postgres/AdminDataSource';
910
import PostgresCallDataSource from '../datasources/postgres/CallDataSource';
@@ -39,6 +40,7 @@ import PostgresTemplateDataSource from '../datasources/postgres/TemplateDataSour
3940
import PostgresUnitDataSource from '../datasources/postgres/UnitDataSource';
4041
import PostgresUserDataSource from '../datasources/postgres/UserDataSource';
4142
import PostgresVisitDataSource from '../datasources/postgres/VisitDataSource';
43+
import PostgresVisitRegistrationClaimDataSource from '../datasources/postgres/VisitRegistrationClaimDataSource';
4244
import PostgresWorkflowDataSource from '../datasources/postgres/WorkflowDataSource';
4345
import { essEmailHandler } from '../eventHandlers/email/essEmailHandler';
4446
import createLoggingHandler from '../eventHandlers/logging';
@@ -97,6 +99,11 @@ mapClass(Tokens.TemplateDataSource, PostgresTemplateDataSource);
9799
mapClass(Tokens.UnitDataSource, PostgresUnitDataSource);
98100
mapClass(Tokens.UserDataSource, PostgresUserDataSource);
99101
mapClass(Tokens.VisitDataSource, PostgresVisitDataSource);
102+
mapClass(
103+
Tokens.VisitRegistrationClaimDataSource,
104+
PostgresVisitRegistrationClaimDataSource
105+
);
106+
mapClass(Tokens.VisitAuthorization, VisitAuthorization);
100107
mapClass(Tokens.VisitRegistrationAuthorization, VisitRegistrationAuthorization);
101108
mapClass(Tokens.TechniqueDataSource, PostgresTechniqueDataSource);
102109
mapClass(

0 commit comments

Comments
 (0)