/
group_created.ts
78 lines (70 loc) · 2.13 KB
/
group_created.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import Joi = require("joi");
import logger from "lib/logger";
import { VError } from "verror";
import * as Result from "../../../result";
import * as AdditionalData from "../additional_data";
import { Identity } from "../organization/identity";
import { Permissions, permissionsSchema } from "../permissions";
import * as Group from "./group";
import { UserMetadata, userMetadataSchema } from "../metadata";
type EventTypeType = "group_created";
const eventType: EventTypeType = "group_created";
interface InitialData {
id: Group.Id;
displayName: string;
description: string;
members: Group.Member[];
permissions: Permissions;
// Additional information (key-value store), e.g. external IDs:
additionalData: object;
}
const initialDataSchema = Joi.object({
id: Group.idSchema.required(),
displayName: Joi.string().required(),
description: Joi.string().allow("").required(),
members: Group.membersSchema.required(),
permissions: permissionsSchema.required(),
additionalData: AdditionalData.schema.required(),
}).options({ stripUnknown: true });
export interface Event {
type: EventTypeType;
source: string;
time: string; // ISO timestamp
publisher: Identity;
group: InitialData;
metadata?: UserMetadata;
}
export const schema = Joi.object({
type: Joi.valid(eventType).required(),
source: Joi.string().allow("").required(),
time: Joi.date().iso().required(),
publisher: Joi.string().required(),
group: initialDataSchema.required(),
metadata: userMetadataSchema,
});
export function createEvent(
source: string,
publisher: Identity,
group: InitialData,
time: string = new Date().toISOString(),
metadata?: UserMetadata,
): Result.Type<Event> {
logger.trace("Creating group created event...");
const event = {
type: eventType,
source,
publisher,
group,
time,
metadata,
};
const validationResult = validate(event);
if (Result.isErr(validationResult)) {
return new VError(validationResult, `not a valid ${eventType} event`);
}
return event;
}
export function validate(input): Result.Type<Event> {
const { error, value } = schema.validate(input);
return !error ? value : error;
}