Skip to content

Commit ad2ef2f

Browse files
feat: publish visit updated for approved visit registration updates and align seed data (#1524)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
1 parent d201ba2 commit ad2ef2f

21 files changed

Lines changed: 217 additions & 64 deletions
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
DO
2+
$$
3+
BEGIN
4+
IF register_patch('0210_AddIdPkToVisitsHasUsers.sql', 'GitHubCopilot', 'Add UUID primary key to visits_has_users', '2026-05-19') THEN
5+
BEGIN
6+
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
7+
8+
ALTER TABLE visits_has_users
9+
ADD COLUMN id UUID;
10+
11+
UPDATE visits_has_users
12+
SET id = uuid_generate_v4()
13+
WHERE id IS NULL;
14+
15+
ALTER TABLE visits_has_users
16+
ALTER COLUMN id SET NOT NULL;
17+
18+
ALTER TABLE visits_has_users
19+
ALTER COLUMN id SET DEFAULT uuid_generate_v4();
20+
21+
ALTER TABLE visits_has_users
22+
DROP CONSTRAINT IF EXISTS visits_has_users_pkey;
23+
24+
ALTER TABLE visits_has_users
25+
ADD CONSTRAINT visits_has_users_pkey PRIMARY KEY (id);
26+
27+
ALTER TABLE visits_has_users
28+
ADD CONSTRAINT visits_has_users_visit_id_user_id_key UNIQUE (visit_id, user_id);
29+
END;
30+
END IF;
31+
END;
32+
$$
33+
LANGUAGE plpgsql;

apps/backend/db_patches/db_seeds/0001_ProposalForScheduling.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ BEGIN
8080
, comment_for_management
8181
, comment_for_user
8282
, notified
83+
, management_decision_submitted
8384
, submitted
8485
)
8586
VALUES
@@ -97,6 +98,7 @@ BEGIN
9798
, NULL
9899
, NULL
99100
, true
101+
, true
100102
, true
101103
);
102104

@@ -120,6 +122,7 @@ BEGIN
120122
, comment_for_management
121123
, comment_for_user
122124
, notified
125+
, management_decision_submitted
123126
, submitted
124127
)
125128
VALUES
@@ -137,6 +140,7 @@ BEGIN
137140
, NULL
138141
, NULL
139142
, true
143+
, true
140144
, true
141145
);
142146

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
DO
2+
$DO$
3+
DECLARE
4+
visit_registration_template_id_var int;
5+
visit_registration_template_topic_id_var int;
6+
BEGIN
7+
INSERT INTO templates(name, description, is_archived, group_id)
8+
VALUES (
9+
'default visit registration template',
10+
'default visit registration template',
11+
false,
12+
'VISIT_REGISTRATION'
13+
)
14+
RETURNING template_id INTO visit_registration_template_id_var;
15+
16+
INSERT INTO topics(topic_title, is_enabled, sort_order, template_id)
17+
VALUES (
18+
'Visit registration',
19+
true,
20+
0,
21+
visit_registration_template_id_var
22+
)
23+
RETURNING topic_id INTO visit_registration_template_topic_id_var;
24+
25+
INSERT INTO templates_has_questions(
26+
question_id,
27+
template_id,
28+
topic_id,
29+
sort_order,
30+
config,
31+
dependencies_operator
32+
)
33+
VALUES (
34+
'visit_basis',
35+
visit_registration_template_id_var,
36+
visit_registration_template_topic_id_var,
37+
0,
38+
'{"titlePlaceholder":"Title","required":false,"small_label":"","tooltip":"","readPermissions":[]}',
39+
'AND'
40+
);
41+
42+
INSERT INTO active_templates(group_id, template_id)
43+
VALUES ('VISIT_REGISTRATION', visit_registration_template_id_var)
44+
ON CONFLICT (group_id)
45+
DO UPDATE SET template_id = EXCLUDED.template_id;
46+
END;
47+
$DO$
48+
LANGUAGE plpgsql;

apps/backend/src/datasources/mockups/VisitDataSource.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,18 @@ import { dummyUserWithRole } from './UserDataSource';
1414
export class VisitDataSourceMock implements VisitDataSource {
1515
private visits: Visit[];
1616
private visitsHasVisitors: VisitRegistration[];
17+
private nextRegistrationId = 1;
18+
19+
private createRegistrationId() {
20+
const id = `mock-visit-registration-${this.nextRegistrationId}`;
21+
this.nextRegistrationId += 1;
22+
23+
return id;
24+
}
25+
1726
init() {
27+
this.nextRegistrationId = 1;
28+
1829
this.visits = [
1930
new Visit(1, 1, 1, dummyUserWithRole.id, new Date(), 1),
2031
new Visit(3, 3, 3, dummyUserWithRole.id, new Date(), 3),
@@ -23,6 +34,7 @@ export class VisitDataSourceMock implements VisitDataSource {
2334

2435
this.visitsHasVisitors = [
2536
new VisitRegistration(
37+
this.createRegistrationId(),
2638
1,
2739
1,
2840
1,
@@ -31,6 +43,7 @@ export class VisitDataSourceMock implements VisitDataSource {
3143
VisitRegistrationStatus.DRAFTED
3244
),
3345
new VisitRegistration(
46+
this.createRegistrationId(),
3447
1,
3548
2,
3649
2,
@@ -120,9 +133,10 @@ export class VisitDataSourceMock implements VisitDataSource {
120133
args.team?.forEach((userId) => {
121134
this.visitsHasVisitors.push(
122135
new VisitRegistration(
123-
this.visitsHasVisitors.length,
124-
userId,
136+
this.createRegistrationId(),
125137
args.visitId,
138+
userId,
139+
null,
126140
new Date(),
127141
new Date(),
128142
VisitRegistrationStatus.DRAFTED

apps/backend/src/datasources/postgres/records.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ export interface UserRecord {
241241
}
242242

243243
export interface VisitRegistrationRecord {
244+
id: string;
244245
user_id: number;
245246
visit_id: number;
246247
registration_questionary_id: number | null;
@@ -976,6 +977,7 @@ export const createVisitRegistrationObject = (
976977
record: VisitRegistrationRecord
977978
) => {
978979
return new VisitRegistration(
980+
record.id,
979981
record.visit_id,
980982
record.user_id,
981983
record.registration_questionary_id,

apps/backend/src/eventHandlers/messageBroker.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export const EXCHANGE_NAME =
4444
enum RABBITMQ_VISIT_EVENT_TYPE {
4545
VISIT_CREATED = 'VISIT_CREATED',
4646
VISIT_DELETED = 'VISIT_DELETED',
47+
VISIT_UPDATED = 'VISIT_UPDATED',
4748
}
4849

4950
type Member = {
@@ -486,26 +487,40 @@ export async function createPostToRabbitMQHandler() {
486487
);
487488
break;
488489
}
490+
case Event.VISIT_REGISTRATION_UPDATED:
489491
case Event.VISIT_REGISTRATION_APPROVED:
490492
case Event.VISIT_REGISTRATION_CANCELLED: {
491493
const { visitregistration: visitRegistration } = event;
494+
495+
if (
496+
event.type === Event.VISIT_REGISTRATION_UPDATED &&
497+
visitRegistration.status !== VisitRegistrationStatus.APPROVED
498+
) {
499+
break;
500+
}
501+
492502
const proposal = await proposalDataSource.getProposalByVisitId(
493503
visitRegistration.visitId
494504
);
495505
const proposalPayload = await getProposalMessageData(proposal);
496506
const user = await userDataSource.getUser(visitRegistration.userId);
497507
const jsonMessage = JSON.stringify({
508+
id: visitRegistration.id,
498509
startAt: visitRegistration.startsAt,
499510
endAt: visitRegistration.endsAt,
500511
visitorId: user!.oidcSub,
501512
proposal: JSON.parse(proposalPayload),
502513
});
514+
let rabbitMQVisitEventType = RABBITMQ_VISIT_EVENT_TYPE.VISIT_UPDATED;
515+
if (event.type === Event.VISIT_REGISTRATION_APPROVED) {
516+
rabbitMQVisitEventType = RABBITMQ_VISIT_EVENT_TYPE.VISIT_CREATED;
517+
} else if (event.type === Event.VISIT_REGISTRATION_CANCELLED) {
518+
rabbitMQVisitEventType = RABBITMQ_VISIT_EVENT_TYPE.VISIT_DELETED;
519+
}
503520

504521
await rabbitMQ.sendMessageToExchange(
505522
EXCHANGE_NAME,
506-
event.type === Event.VISIT_REGISTRATION_APPROVED
507-
? RABBITMQ_VISIT_EVENT_TYPE.VISIT_CREATED
508-
: RABBITMQ_VISIT_EVENT_TYPE.VISIT_DELETED,
523+
rabbitMQVisitEventType,
509524
jsonMessage
510525
);
511526

apps/backend/src/events/applicationEvents.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,12 @@ interface VisitCreatedEvent extends GeneralEvent {
396396
type: Event.VISIT_CREATED;
397397
visit: Visit;
398398
}
399+
400+
interface VisitRegistrationUpdatedEvent extends GeneralEvent {
401+
type: Event.VISIT_REGISTRATION_UPDATED;
402+
visitregistration: VisitRegistration;
403+
}
404+
399405
interface VisitRegistrationApprovedEvent extends GeneralEvent {
400406
type: Event.VISIT_REGISTRATION_APPROVED;
401407
visitregistration: VisitRegistration;
@@ -545,6 +551,7 @@ export type ApplicationEvent =
545551
| InternalReviewUpdated
546552
| InternalReviewDeleted
547553
| VisitCreatedEvent
554+
| VisitRegistrationUpdatedEvent
548555
| VisitRegistrationApprovedEvent
549556
| VisitRegistrationCancelledEvent
550557
| UserDataAccessUpdatedEvent

apps/backend/src/events/event.enum.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ export enum Event {
117117
INSTRUMENTS_REMOVED_FROM_TECHNIQUE = 'INSTRUMENTS_REMOVED_FROM_TECHNIQUE',
118118
PROPOSAL_ASSIGNED_TO_TECHNIQUES = 'PROPOSAL_ASSIGNED_TO_TECHNIQUES',
119119
VISIT_REGISTRATION_APPROVED = 'VISIT_REGISTRATION_APPROVED',
120+
VISIT_REGISTRATION_UPDATED = 'VISIT_REGISTRATION_UPDATED',
120121
VISIT_REGISTRATION_CANCELLED = 'VISIT_REGISTRATION_CANCELLED',
121122
EXPERIMENT_ESF_SUBMITTED = 'EXPERIMENT_ESF_SUBMITTED',
122123
EXPERIMENT_ESF_APPROVED_BY_IS = 'EXPERIMENT_ESF_APPROVED_BY_IS',

apps/backend/src/models/VisitRegistration.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export class VisitRegistration {
22
constructor(
3+
public id: string,
34
public visitId: number,
45
public userId: number,
56
public registrationQuestionaryId: number | null,

apps/backend/src/mutations/VisitMutations.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ export default class VisitMutations {
252252
}
253253

254254
@Authorized()
255+
@EventBus(Event.VISIT_REGISTRATION_UPDATED)
255256
async updateVisitRegistration(
256257
agent: UserWithRole | null,
257258
args: UpdateVisitRegistrationArgs

0 commit comments

Comments
 (0)