Skip to content

Commit 3367488

Browse files
Andre TurnerCarsonF
andcommitted
Create unavailability edgedb repo
Co-authored-by: Carson Full <[email protected]>
1 parent 9c440fb commit 3367488

File tree

2 files changed

+73
-1
lines changed

2 files changed

+73
-1
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { Injectable } from '@nestjs/common';
2+
import { Range } from 'edgedb';
3+
import { ID, PublicOf } from '~/common';
4+
import { e, RepoFor } from '~/core/edgedb';
5+
import {
6+
CreateUnavailability,
7+
Unavailability,
8+
UpdateUnavailability,
9+
} from './dto';
10+
import { UnavailabilityRepository } from './unavailability.repository';
11+
12+
@Injectable()
13+
export class UnavailabilityEdgeDBRepository
14+
extends RepoFor(Unavailability, {
15+
hydrate: (unavailability) => ({
16+
...unavailability['*'],
17+
start: e.assert_exists(e.range_get_lower(unavailability.dates)),
18+
end: e.assert_exists(e.range_get_upper(unavailability.dates)),
19+
}),
20+
}).customize((cls) => {
21+
return class extends cls {
22+
async create(input: CreateUnavailability) {
23+
const user = e.cast(e.User, e.uuid(input.userId));
24+
const inserted = e.insert(e.User.Unavailability, {
25+
description: input.description,
26+
dates: new Range(input.start, input.end),
27+
});
28+
const updatedUser = e.update(user, () => ({
29+
set: {
30+
unavailabilities: { '+=': inserted },
31+
},
32+
}));
33+
const query = e.select(inserted, (u) => ({
34+
...this.hydrate(u),
35+
updatedUser, // Attach to query, so it is executed.
36+
}));
37+
return await this.db.run(query);
38+
}
39+
40+
async update(input: UpdateUnavailability) {
41+
const unavailability = e.cast(e.User.Unavailability, e.uuid(input.id));
42+
const updated = e.update(unavailability, () => ({
43+
set: {
44+
description: input.description,
45+
dates: e.cast(
46+
e.range(e.datetime),
47+
e.range(
48+
input.start ?? e.range_get_lower(unavailability.dates),
49+
input.end ?? e.range_get_upper(unavailability.dates),
50+
),
51+
),
52+
},
53+
}));
54+
const query = e.select(updated, this.hydrate);
55+
return await this.db.run(query);
56+
}
57+
};
58+
})
59+
implements PublicOf<UnavailabilityRepository>
60+
{
61+
async getUserIdByUnavailability(id: ID) {
62+
const unavailability = e.cast(e.User.Unavailability, e.uuid(id));
63+
const query = e.assert_exists(
64+
e.select(e.User, (user) => ({
65+
filter_single: e.op(unavailability, 'in', user.unavailabilities),
66+
})),
67+
);
68+
return await this.db.run(query);
69+
}
70+
}

src/components/user/unavailability/unavailability.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { forwardRef, Module } from '@nestjs/common';
2+
import { splitDb } from '~/core/database';
23
import { AuthorizationModule } from '../../authorization/authorization.module';
4+
import { UnavailabilityEdgeDBRepository } from './unavailability.edgedb.repository';
35
import { UnavailabilityLoader } from './unavailability.loader';
46
import { UnavailabilityRepository } from './unavailability.repository';
57
import { UnavailabilityResolver } from './unavailability.resolver';
@@ -10,7 +12,7 @@ import { UnavailabilityService } from './unavailability.service';
1012
providers: [
1113
UnavailabilityResolver,
1214
UnavailabilityService,
13-
UnavailabilityRepository,
15+
splitDb(UnavailabilityRepository, UnavailabilityEdgeDBRepository),
1416
UnavailabilityLoader,
1517
],
1618
exports: [UnavailabilityService],

0 commit comments

Comments
 (0)