-
Notifications
You must be signed in to change notification settings - Fork 57
/
Copy pathcreate-passage.js
45 lines (38 loc) · 1.36 KB
/
create-passage.js
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
import { withTransaction } from '../../../shared/domain/DomainTransaction.js';
import { NotFoundError } from '../../../shared/domain/errors.js';
import { ModuleDoesNotExistError } from '../errors.js';
import { PassageStartedEvent } from '../models/passage-events/passage-events.js';
const createPassage = withTransaction(async function ({
moduleId,
occurredAt,
userId,
moduleRepository,
passageRepository,
passageEventRepository,
userRepository,
}) {
const module = await _getModule({ moduleId, moduleRepository });
if (userId !== null) {
await userRepository.get(userId);
}
const passage = await passageRepository.save({ moduleId, userId });
await _recordPassageEvent({ module, occurredAt, passage, passageEventRepository });
return passage;
});
async function _getModule({ moduleId, moduleRepository }) {
try {
return await moduleRepository.getBySlug({ slug: moduleId });
} catch (e) {
if (e instanceof NotFoundError) {
throw new ModuleDoesNotExistError();
}
throw e;
}
}
async function _recordPassageEvent({ module, occurredAt, passage, passageEventRepository }) {
const { id: passageId } = passage;
const contentHash = module.version;
const passageStartedEvent = new PassageStartedEvent({ contentHash, passageId, occurredAt });
await passageEventRepository.record(passageStartedEvent);
}
export { createPassage };