@sideline/domain 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/api/Auth.js +17 -5
- package/dist/cjs/api/Auth.js.map +1 -1
- package/dist/cjs/api/EventApi.js +141 -0
- package/dist/cjs/api/EventApi.js.map +1 -0
- package/dist/cjs/api/EventRsvpApi.js +66 -0
- package/dist/cjs/api/EventRsvpApi.js.map +1 -0
- package/dist/cjs/api/EventSeriesApi.js +139 -0
- package/dist/cjs/api/EventSeriesApi.js.map +1 -0
- package/dist/cjs/api/Roster.js +3 -2
- package/dist/cjs/api/Roster.js.map +1 -1
- package/dist/cjs/api/TeamSettingsApi.js +55 -0
- package/dist/cjs/api/TeamSettingsApi.js.map +1 -0
- package/dist/cjs/api/TrainingTypeApi.js +7 -2
- package/dist/cjs/api/TrainingTypeApi.js.map +1 -1
- package/dist/cjs/index.js +23 -1
- package/dist/cjs/models/Event.js +36 -0
- package/dist/cjs/models/Event.js.map +1 -0
- package/dist/cjs/models/EventRsvp.js +23 -0
- package/dist/cjs/models/EventRsvp.js.map +1 -0
- package/dist/cjs/models/EventSeries.js +35 -0
- package/dist/cjs/models/EventSeries.js.map +1 -0
- package/dist/cjs/models/Role.js +3 -3
- package/dist/cjs/models/Role.js.map +1 -1
- package/dist/cjs/models/Session.js +3 -5
- package/dist/cjs/models/Session.js.map +1 -1
- package/dist/cjs/models/TeamInvite.js +3 -5
- package/dist/cjs/models/TeamInvite.js.map +1 -1
- package/dist/cjs/models/TeamSettings.js +17 -0
- package/dist/cjs/models/TeamSettings.js.map +1 -0
- package/dist/cjs/models/User.js +3 -1
- package/dist/cjs/models/User.js.map +1 -1
- package/dist/cjs/rpc/SyncRpcs.js +2 -1
- package/dist/cjs/rpc/SyncRpcs.js.map +1 -1
- package/dist/cjs/rpc/event/EventRpcEvents.js +45 -0
- package/dist/cjs/rpc/event/EventRpcEvents.js.map +1 -0
- package/dist/cjs/rpc/event/EventRpcGroup.js +65 -0
- package/dist/cjs/rpc/event/EventRpcGroup.js.map +1 -0
- package/dist/cjs/rpc/event/EventRpcModels.js +47 -0
- package/dist/cjs/rpc/event/EventRpcModels.js.map +1 -0
- package/dist/dts/api/Auth.d.ts +12 -12
- package/dist/dts/api/Auth.d.ts.map +1 -1
- package/dist/dts/api/EventApi.d.ts +273 -0
- package/dist/dts/api/EventApi.d.ts.map +1 -0
- package/dist/dts/api/EventRsvpApi.d.ts +96 -0
- package/dist/dts/api/EventRsvpApi.d.ts.map +1 -0
- package/dist/dts/api/EventSeriesApi.d.ts +284 -0
- package/dist/dts/api/EventSeriesApi.d.ts.map +1 -0
- package/dist/dts/api/NotificationApi.d.ts +2 -2
- package/dist/dts/api/RoleApi.d.ts +9 -9
- package/dist/dts/api/Roster.d.ts +13 -9
- package/dist/dts/api/Roster.d.ts.map +1 -1
- package/dist/dts/api/TeamSettingsApi.d.ts +107 -0
- package/dist/dts/api/TeamSettingsApi.d.ts.map +1 -0
- package/dist/dts/api/TrainingTypeApi.d.ts +16 -0
- package/dist/dts/api/TrainingTypeApi.d.ts.map +1 -1
- package/dist/dts/index.d.ts +11 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/models/ChannelSyncEvent.d.ts +6 -6
- package/dist/dts/models/Event.d.ts +233 -0
- package/dist/dts/models/Event.d.ts.map +1 -0
- package/dist/dts/models/EventRsvp.d.ts +110 -0
- package/dist/dts/models/EventRsvp.d.ts.map +1 -0
- package/dist/dts/models/EventSeries.d.ts +248 -0
- package/dist/dts/models/EventSeries.d.ts.map +1 -0
- package/dist/dts/models/Notification.d.ts +4 -4
- package/dist/dts/models/Role.d.ts +4 -4
- package/dist/dts/models/Role.d.ts.map +1 -1
- package/dist/dts/models/RoleSyncEvent.d.ts +4 -4
- package/dist/dts/models/Session.d.ts +6 -6
- package/dist/dts/models/Session.d.ts.map +1 -1
- package/dist/dts/models/TeamInvite.d.ts +6 -6
- package/dist/dts/models/TeamInvite.d.ts.map +1 -1
- package/dist/dts/models/TeamSettings.d.ts +70 -0
- package/dist/dts/models/TeamSettings.d.ts.map +1 -0
- package/dist/dts/models/User.d.ts +11 -11
- package/dist/dts/models/User.d.ts.map +1 -1
- package/dist/dts/rpc/SyncRpcs.d.ts +28 -1
- package/dist/dts/rpc/SyncRpcs.d.ts.map +1 -1
- package/dist/dts/rpc/event/EventRpcEvents.d.ts +49 -0
- package/dist/dts/rpc/event/EventRpcEvents.d.ts.map +1 -0
- package/dist/dts/rpc/event/EventRpcGroup.d.ts +32 -0
- package/dist/dts/rpc/event/EventRpcGroup.d.ts.map +1 -0
- package/dist/dts/rpc/event/EventRpcModels.d.ts +115 -0
- package/dist/dts/rpc/event/EventRpcModels.d.ts.map +1 -0
- package/dist/esm/api/Auth.js +17 -5
- package/dist/esm/api/Auth.js.map +1 -1
- package/dist/esm/api/EventApi.js +126 -0
- package/dist/esm/api/EventApi.js.map +1 -0
- package/dist/esm/api/EventRsvpApi.js +53 -0
- package/dist/esm/api/EventRsvpApi.js.map +1 -0
- package/dist/esm/api/EventSeriesApi.js +126 -0
- package/dist/esm/api/EventSeriesApi.js.map +1 -0
- package/dist/esm/api/Roster.js +3 -2
- package/dist/esm/api/Roster.js.map +1 -1
- package/dist/esm/api/TeamSettingsApi.js +46 -0
- package/dist/esm/api/TeamSettingsApi.js.map +1 -0
- package/dist/esm/api/TrainingTypeApi.js +7 -2
- package/dist/esm/api/TrainingTypeApi.js.map +1 -1
- package/dist/esm/index.js +11 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/models/Event.js +28 -0
- package/dist/esm/models/Event.js.map +1 -0
- package/dist/esm/models/EventRsvp.js +16 -0
- package/dist/esm/models/EventRsvp.js.map +1 -0
- package/dist/esm/models/EventSeries.js +28 -0
- package/dist/esm/models/EventSeries.js.map +1 -0
- package/dist/esm/models/Role.js +3 -3
- package/dist/esm/models/Role.js.map +1 -1
- package/dist/esm/models/Session.js +3 -6
- package/dist/esm/models/Session.js.map +1 -1
- package/dist/esm/models/TeamInvite.js +3 -6
- package/dist/esm/models/TeamInvite.js.map +1 -1
- package/dist/esm/models/TeamSettings.js +10 -0
- package/dist/esm/models/TeamSettings.js.map +1 -0
- package/dist/esm/models/User.js +2 -1
- package/dist/esm/models/User.js.map +1 -1
- package/dist/esm/rpc/SyncRpcs.js +2 -1
- package/dist/esm/rpc/SyncRpcs.js.map +1 -1
- package/dist/esm/rpc/event/EventRpcEvents.js +36 -0
- package/dist/esm/rpc/event/EventRpcEvents.js.map +1 -0
- package/dist/esm/rpc/event/EventRpcGroup.js +59 -0
- package/dist/esm/rpc/event/EventRpcGroup.js.map +1 -0
- package/dist/esm/rpc/event/EventRpcModels.js +33 -0
- package/dist/esm/rpc/event/EventRpcModels.js.map +1 -0
- package/package.json +3 -2
- package/src/api/Auth.ts +20 -12
- package/src/api/EventApi.ts +129 -0
- package/src/api/EventRsvpApi.ts +67 -0
- package/src/api/EventSeriesApi.ts +134 -0
- package/src/api/Roster.ts +3 -2
- package/src/api/TeamSettingsApi.ts +57 -0
- package/src/api/TrainingTypeApi.ts +3 -0
- package/src/index.ts +19 -0
- package/src/models/Event.ts +41 -0
- package/src/models/EventRsvp.ts +20 -0
- package/src/models/EventSeries.ts +36 -0
- package/src/models/Role.ts +16 -1
- package/src/models/Session.ts +3 -7
- package/src/models/TeamInvite.ts +3 -9
- package/src/models/TeamSettings.ts +10 -0
- package/src/models/User.ts +2 -1
- package/src/rpc/SyncRpcs.ts +7 -1
- package/src/rpc/event/EventRpcEvents.ts +48 -0
- package/src/rpc/event/EventRpcGroup.ts +60 -0
- package/src/rpc/event/EventRpcModels.ts +49 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { HttpApiEndpoint, HttpApiGroup } from '@effect/platform';
|
|
2
|
+
import { Schema } from 'effect';
|
|
3
|
+
import { AuthMiddleware } from '~/api/Auth.js';
|
|
4
|
+
import { Forbidden } from '~/api/EventApi.js';
|
|
5
|
+
import { TeamId } from '~/models/Team.js';
|
|
6
|
+
|
|
7
|
+
export class TeamSettingsInfo extends Schema.Class<TeamSettingsInfo>('TeamSettingsInfo')({
|
|
8
|
+
teamId: TeamId,
|
|
9
|
+
eventHorizonDays: Schema.Int,
|
|
10
|
+
discordChannelTraining: Schema.NullOr(Schema.String),
|
|
11
|
+
discordChannelMatch: Schema.NullOr(Schema.String),
|
|
12
|
+
discordChannelTournament: Schema.NullOr(Schema.String),
|
|
13
|
+
discordChannelMeeting: Schema.NullOr(Schema.String),
|
|
14
|
+
discordChannelSocial: Schema.NullOr(Schema.String),
|
|
15
|
+
discordChannelOther: Schema.NullOr(Schema.String),
|
|
16
|
+
}) {}
|
|
17
|
+
|
|
18
|
+
export class UpdateTeamSettingsRequest extends Schema.Class<UpdateTeamSettingsRequest>(
|
|
19
|
+
'UpdateTeamSettingsRequest',
|
|
20
|
+
)({
|
|
21
|
+
eventHorizonDays: Schema.Int.pipe(Schema.between(1, 365)),
|
|
22
|
+
discordChannelTraining: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), {
|
|
23
|
+
as: 'Option',
|
|
24
|
+
}),
|
|
25
|
+
discordChannelMatch: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), {
|
|
26
|
+
as: 'Option',
|
|
27
|
+
}),
|
|
28
|
+
discordChannelTournament: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), {
|
|
29
|
+
as: 'Option',
|
|
30
|
+
}),
|
|
31
|
+
discordChannelMeeting: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), {
|
|
32
|
+
as: 'Option',
|
|
33
|
+
}),
|
|
34
|
+
discordChannelSocial: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), {
|
|
35
|
+
as: 'Option',
|
|
36
|
+
}),
|
|
37
|
+
discordChannelOther: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), {
|
|
38
|
+
as: 'Option',
|
|
39
|
+
}),
|
|
40
|
+
}) {}
|
|
41
|
+
|
|
42
|
+
export class TeamSettingsApiGroup extends HttpApiGroup.make('teamSettings')
|
|
43
|
+
.add(
|
|
44
|
+
HttpApiEndpoint.get('getTeamSettings', '/teams/:teamId/settings')
|
|
45
|
+
.addSuccess(TeamSettingsInfo)
|
|
46
|
+
.addError(Forbidden, { status: 403 })
|
|
47
|
+
.setPath(Schema.Struct({ teamId: TeamId }))
|
|
48
|
+
.middleware(AuthMiddleware),
|
|
49
|
+
)
|
|
50
|
+
.add(
|
|
51
|
+
HttpApiEndpoint.patch('updateTeamSettings', '/teams/:teamId/settings')
|
|
52
|
+
.addSuccess(TeamSettingsInfo)
|
|
53
|
+
.addError(Forbidden, { status: 403 })
|
|
54
|
+
.setPath(Schema.Struct({ teamId: TeamId }))
|
|
55
|
+
.setPayload(UpdateTeamSettingsRequest)
|
|
56
|
+
.middleware(AuthMiddleware),
|
|
57
|
+
) {}
|
|
@@ -18,6 +18,7 @@ export class TrainingTypeDetail extends Schema.Class<TrainingTypeDetail>('Traini
|
|
|
18
18
|
name: Schema.String,
|
|
19
19
|
groupId: Schema.NullOr(GroupId),
|
|
20
20
|
groupName: Schema.NullOr(Schema.String),
|
|
21
|
+
discordChannelId: Schema.NullOr(Schema.String),
|
|
21
22
|
canAdmin: Schema.Boolean,
|
|
22
23
|
}) {}
|
|
23
24
|
|
|
@@ -33,12 +34,14 @@ export class CreateTrainingTypeRequest extends Schema.Class<CreateTrainingTypeRe
|
|
|
33
34
|
)({
|
|
34
35
|
name: Schema.NonEmptyString,
|
|
35
36
|
groupId: Schema.NullOr(GroupId),
|
|
37
|
+
discordChannelId: Schema.NullOr(Schema.String),
|
|
36
38
|
}) {}
|
|
37
39
|
|
|
38
40
|
export class UpdateTrainingTypeRequest extends Schema.Class<UpdateTrainingTypeRequest>(
|
|
39
41
|
'UpdateTrainingTypeRequest',
|
|
40
42
|
)({
|
|
41
43
|
name: Schema.NonEmptyString,
|
|
44
|
+
discordChannelId: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), { as: 'Option' }),
|
|
42
45
|
}) {}
|
|
43
46
|
|
|
44
47
|
export class TrainingTypeNotFound extends Schema.TaggedError<TrainingTypeNotFound>()(
|
package/src/index.ts
CHANGED
|
@@ -4,6 +4,12 @@ export * as AgeThresholdApi from './api/AgeThresholdApi.js';
|
|
|
4
4
|
|
|
5
5
|
export * as Auth from './api/Auth.js';
|
|
6
6
|
|
|
7
|
+
export * as EventApi from './api/EventApi.js';
|
|
8
|
+
|
|
9
|
+
export * as EventRsvpApi from './api/EventRsvpApi.js';
|
|
10
|
+
|
|
11
|
+
export * as EventSeriesApi from './api/EventSeriesApi.js';
|
|
12
|
+
|
|
7
13
|
export * as GroupApi from './api/GroupApi.js';
|
|
8
14
|
|
|
9
15
|
export * as Invite from './api/Invite.js';
|
|
@@ -14,6 +20,8 @@ export * as RoleApi from './api/RoleApi.js';
|
|
|
14
20
|
|
|
15
21
|
export * as Roster from './api/Roster.js';
|
|
16
22
|
|
|
23
|
+
export * as TeamSettingsApi from './api/TeamSettingsApi.js';
|
|
24
|
+
|
|
17
25
|
export * as TrainingTypeApi from './api/TrainingTypeApi.js';
|
|
18
26
|
|
|
19
27
|
export * as AgeThresholdRule from './models/AgeThresholdRule.js';
|
|
@@ -26,6 +34,12 @@ export * as DiscordChannelMapping from './models/DiscordChannelMapping.js';
|
|
|
26
34
|
|
|
27
35
|
export * as DiscordRoleMapping from './models/DiscordRoleMapping.js';
|
|
28
36
|
|
|
37
|
+
export * as Event from './models/Event.js';
|
|
38
|
+
|
|
39
|
+
export * as EventRsvp from './models/EventRsvp.js';
|
|
40
|
+
|
|
41
|
+
export * as EventSeries from './models/EventSeries.js';
|
|
42
|
+
|
|
29
43
|
export * as GroupModel from './models/GroupModel.js';
|
|
30
44
|
|
|
31
45
|
export * as MemberRole from './models/MemberRole.js';
|
|
@@ -50,12 +64,17 @@ export * as TeamInvite from './models/TeamInvite.js';
|
|
|
50
64
|
|
|
51
65
|
export * as TeamMember from './models/TeamMember.js';
|
|
52
66
|
|
|
67
|
+
export * as TeamSettings from './models/TeamSettings.js';
|
|
68
|
+
|
|
53
69
|
export * as TrainingType from './models/TrainingType.js';
|
|
54
70
|
|
|
55
71
|
export * as User from './models/User.js';
|
|
56
72
|
export * as ChannelRpcEvents from './rpc/channel/ChannelRpcEvents.js';
|
|
57
73
|
export * as ChannelRpcGroup from './rpc/channel/ChannelRpcGroup.js';
|
|
58
74
|
export * as ChannelRpcModels from './rpc/channel/ChannelRpcModels.js';
|
|
75
|
+
export * as EventRpcEvents from './rpc/event/EventRpcEvents.js';
|
|
76
|
+
export * as EventRpcGroup from './rpc/event/EventRpcGroup.js';
|
|
77
|
+
export * as EventRpcModels from './rpc/event/EventRpcModels.js';
|
|
59
78
|
export * as GuildRpcGroup from './rpc/guild/GuildRpcGroup.js';
|
|
60
79
|
export * as RoleRpcEvents from './rpc/role/RoleRpcEvents.js';
|
|
61
80
|
export * as RoleRpcGroup from './rpc/role/RoleRpcGroup.js';
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Model } from '@effect/sql';
|
|
2
|
+
import * as Schemas from '@sideline/effect-lib/Schemas';
|
|
3
|
+
import { Schema } from 'effect';
|
|
4
|
+
import { EventSeriesId } from '~/models/EventSeries.js';
|
|
5
|
+
import { TeamId } from '~/models/Team.js';
|
|
6
|
+
import { TeamMemberId } from '~/models/TeamMember.js';
|
|
7
|
+
import { TrainingTypeId } from '~/models/TrainingType.js';
|
|
8
|
+
|
|
9
|
+
export const EventId = Schema.String.pipe(Schema.brand('EventId'));
|
|
10
|
+
export type EventId = typeof EventId.Type;
|
|
11
|
+
|
|
12
|
+
export const EventType = Schema.Literal(
|
|
13
|
+
'training',
|
|
14
|
+
'match',
|
|
15
|
+
'tournament',
|
|
16
|
+
'meeting',
|
|
17
|
+
'social',
|
|
18
|
+
'other',
|
|
19
|
+
);
|
|
20
|
+
export type EventType = typeof EventType.Type;
|
|
21
|
+
|
|
22
|
+
export const EventStatus = Schema.Literal('active', 'cancelled');
|
|
23
|
+
export type EventStatus = typeof EventStatus.Type;
|
|
24
|
+
|
|
25
|
+
export class Event extends Model.Class<Event>('Event')({
|
|
26
|
+
id: Model.Generated(EventId),
|
|
27
|
+
team_id: TeamId,
|
|
28
|
+
training_type_id: Schema.NullOr(TrainingTypeId),
|
|
29
|
+
event_type: EventType,
|
|
30
|
+
title: Schema.String,
|
|
31
|
+
description: Schema.NullOr(Schema.String),
|
|
32
|
+
start_at: Schemas.DateTimeFromDate,
|
|
33
|
+
end_at: Schema.NullOr(Schemas.DateTimeFromDate),
|
|
34
|
+
location: Schema.NullOr(Schema.String),
|
|
35
|
+
series_id: Schema.NullOr(EventSeriesId),
|
|
36
|
+
series_modified: Schema.Boolean,
|
|
37
|
+
status: Model.FieldExcept('update')(EventStatus),
|
|
38
|
+
created_by: TeamMemberId,
|
|
39
|
+
created_at: Model.DateTimeInsertFromDate,
|
|
40
|
+
updated_at: Model.DateTimeUpdateFromDate,
|
|
41
|
+
}) {}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Model } from '@effect/sql';
|
|
2
|
+
import { Schema } from 'effect';
|
|
3
|
+
import { EventId } from '~/models/Event.js';
|
|
4
|
+
import { TeamMemberId } from '~/models/TeamMember.js';
|
|
5
|
+
|
|
6
|
+
export const EventRsvpId = Schema.String.pipe(Schema.brand('EventRsvpId'));
|
|
7
|
+
export type EventRsvpId = typeof EventRsvpId.Type;
|
|
8
|
+
|
|
9
|
+
export const RsvpResponse = Schema.Literal('yes', 'no', 'maybe');
|
|
10
|
+
export type RsvpResponse = typeof RsvpResponse.Type;
|
|
11
|
+
|
|
12
|
+
export class EventRsvp extends Model.Class<EventRsvp>('EventRsvp')({
|
|
13
|
+
id: Model.Generated(EventRsvpId),
|
|
14
|
+
event_id: EventId,
|
|
15
|
+
team_member_id: TeamMemberId,
|
|
16
|
+
response: RsvpResponse,
|
|
17
|
+
message: Schema.NullOr(Schema.String),
|
|
18
|
+
created_at: Model.DateTimeInsertFromDate,
|
|
19
|
+
updated_at: Model.DateTimeUpdateFromDate,
|
|
20
|
+
}) {}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Model } from '@effect/sql';
|
|
2
|
+
import { Schema } from 'effect';
|
|
3
|
+
import { TeamId } from '~/models/Team.js';
|
|
4
|
+
import { TeamMemberId } from '~/models/TeamMember.js';
|
|
5
|
+
import { TrainingTypeId } from '~/models/TrainingType.js';
|
|
6
|
+
|
|
7
|
+
export const EventSeriesId = Schema.String.pipe(Schema.brand('EventSeriesId'));
|
|
8
|
+
export type EventSeriesId = typeof EventSeriesId.Type;
|
|
9
|
+
|
|
10
|
+
export const RecurrenceFrequency = Schema.Literal('weekly', 'biweekly');
|
|
11
|
+
export type RecurrenceFrequency = typeof RecurrenceFrequency.Type;
|
|
12
|
+
|
|
13
|
+
export const DayOfWeek = Schema.Int.pipe(Schema.between(0, 6), Schema.brand('DayOfWeek'));
|
|
14
|
+
export type DayOfWeek = typeof DayOfWeek.Type;
|
|
15
|
+
|
|
16
|
+
export const EventSeriesStatus = Schema.Literal('active', 'cancelled');
|
|
17
|
+
export type EventSeriesStatus = typeof EventSeriesStatus.Type;
|
|
18
|
+
|
|
19
|
+
export class EventSeries extends Model.Class<EventSeries>('EventSeries')({
|
|
20
|
+
id: Model.Generated(EventSeriesId),
|
|
21
|
+
team_id: TeamId,
|
|
22
|
+
training_type_id: Schema.NullOr(TrainingTypeId),
|
|
23
|
+
title: Schema.String,
|
|
24
|
+
description: Schema.NullOr(Schema.String),
|
|
25
|
+
start_time: Schema.String,
|
|
26
|
+
end_time: Schema.NullOr(Schema.String),
|
|
27
|
+
location: Schema.NullOr(Schema.String),
|
|
28
|
+
frequency: RecurrenceFrequency,
|
|
29
|
+
day_of_week: DayOfWeek,
|
|
30
|
+
start_date: Schema.DateFromSelf,
|
|
31
|
+
end_date: Schema.NullOr(Schema.DateFromSelf),
|
|
32
|
+
status: Model.FieldExcept('update')(EventSeriesStatus),
|
|
33
|
+
created_by: TeamMemberId,
|
|
34
|
+
created_at: Model.DateTimeInsertFromDate,
|
|
35
|
+
updated_at: Model.DateTimeUpdateFromDate,
|
|
36
|
+
}) {}
|
package/src/models/Role.ts
CHANGED
|
@@ -17,6 +17,9 @@ export const Permission = Schema.Literal(
|
|
|
17
17
|
'role:manage',
|
|
18
18
|
'training-type:create',
|
|
19
19
|
'training-type:delete',
|
|
20
|
+
'event:create',
|
|
21
|
+
'event:edit',
|
|
22
|
+
'event:cancel',
|
|
20
23
|
);
|
|
21
24
|
export type Permission = typeof Permission.Type;
|
|
22
25
|
|
|
@@ -36,8 +39,20 @@ export const defaultPermissions: Record<string, ReadonlyArray<Permission>> = {
|
|
|
36
39
|
'role:manage',
|
|
37
40
|
'training-type:create',
|
|
38
41
|
'training-type:delete',
|
|
42
|
+
'event:create',
|
|
43
|
+
'event:edit',
|
|
44
|
+
'event:cancel',
|
|
45
|
+
],
|
|
46
|
+
Captain: [
|
|
47
|
+
'roster:view',
|
|
48
|
+
'roster:manage',
|
|
49
|
+
'member:view',
|
|
50
|
+
'member:edit',
|
|
51
|
+
'role:view',
|
|
52
|
+
'event:create',
|
|
53
|
+
'event:edit',
|
|
54
|
+
'event:cancel',
|
|
39
55
|
],
|
|
40
|
-
Captain: ['roster:view', 'roster:manage', 'member:view', 'member:edit', 'role:view'],
|
|
41
56
|
Player: ['roster:view', 'member:view'],
|
|
42
57
|
};
|
|
43
58
|
|
package/src/models/Session.ts
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
import { Model } from '@effect/sql';
|
|
2
|
-
import
|
|
2
|
+
import * as Schemas from '@sideline/effect-lib/Schemas';
|
|
3
|
+
import { Schema } from 'effect';
|
|
3
4
|
import { UserId } from '~/models/User.js';
|
|
4
5
|
|
|
5
|
-
const DateTimeFromDate = Schema.transform(Schema.DateFromSelf, Schema.DateTimeUtcFromSelf, {
|
|
6
|
-
decode: (date) => DateTime.unsafeFromDate(date),
|
|
7
|
-
encode: (dt) => new Date(DateTime.toEpochMillis(dt)),
|
|
8
|
-
});
|
|
9
|
-
|
|
10
6
|
export class Session extends Model.Class<Session>('Session')({
|
|
11
7
|
id: Model.Generated(Schema.String),
|
|
12
8
|
user_id: UserId,
|
|
13
9
|
token: Schema.String,
|
|
14
|
-
expires_at: DateTimeFromDate,
|
|
10
|
+
expires_at: Schemas.DateTimeFromDate,
|
|
15
11
|
created_at: Model.DateTimeInsertFromDate,
|
|
16
12
|
}) {}
|
package/src/models/TeamInvite.ts
CHANGED
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
import { Model } from '@effect/sql';
|
|
2
|
-
import
|
|
2
|
+
import * as Schemas from '@sideline/effect-lib/Schemas';
|
|
3
|
+
import { Schema } from 'effect';
|
|
3
4
|
import { TeamId } from '~/models/Team.js';
|
|
4
5
|
import { UserId } from '~/models/User.js';
|
|
5
6
|
|
|
6
7
|
export const TeamInviteId = Schema.String.pipe(Schema.brand('TeamInviteId'));
|
|
7
8
|
export type TeamInviteId = typeof TeamInviteId.Type;
|
|
8
9
|
|
|
9
|
-
const NullableDateTimeFromDate = Schema.NullOr(
|
|
10
|
-
Schema.transform(Schema.DateFromSelf, Schema.DateTimeUtcFromSelf, {
|
|
11
|
-
decode: (date) => DateTime.unsafeFromDate(date),
|
|
12
|
-
encode: (dt) => new Date(DateTime.toEpochMillis(dt)),
|
|
13
|
-
}),
|
|
14
|
-
);
|
|
15
|
-
|
|
16
10
|
export class TeamInvite extends Model.Class<TeamInvite>('TeamInvite')({
|
|
17
11
|
id: Model.Generated(TeamInviteId),
|
|
18
12
|
team_id: TeamId,
|
|
@@ -20,5 +14,5 @@ export class TeamInvite extends Model.Class<TeamInvite>('TeamInvite')({
|
|
|
20
14
|
active: Schema.Boolean,
|
|
21
15
|
created_by: UserId,
|
|
22
16
|
created_at: Model.DateTimeInsertFromDate,
|
|
23
|
-
expires_at:
|
|
17
|
+
expires_at: Schema.NullOr(Schemas.DateTimeFromDate),
|
|
24
18
|
}) {}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Model } from '@effect/sql';
|
|
2
|
+
import { Schema } from 'effect';
|
|
3
|
+
import { TeamId } from '~/models/Team.js';
|
|
4
|
+
|
|
5
|
+
export class TeamSettings extends Model.Class<TeamSettings>('TeamSettings')({
|
|
6
|
+
team_id: TeamId,
|
|
7
|
+
event_horizon_days: Schema.Int,
|
|
8
|
+
created_at: Model.DateTimeInsertFromDate,
|
|
9
|
+
updated_at: Model.DateTimeUpdateFromDate,
|
|
10
|
+
}) {}
|
package/src/models/User.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Model } from '@effect/sql';
|
|
2
|
+
import * as Schemas from '@sideline/effect-lib/Schemas';
|
|
2
3
|
import { Schema } from 'effect';
|
|
3
4
|
|
|
4
5
|
export const UserId = Schema.String.pipe(Schema.brand('UserId'));
|
|
@@ -18,7 +19,7 @@ export class User extends Model.Class<User>('User')({
|
|
|
18
19
|
discord_access_token: Model.Sensitive(Schema.String),
|
|
19
20
|
discord_refresh_token: Model.Sensitive(Schema.NullOr(Schema.String)),
|
|
20
21
|
name: Schema.NullOr(Schema.String),
|
|
21
|
-
|
|
22
|
+
birth_date: Schema.OptionFromNullOr(Schemas.DateTimeFromDate),
|
|
22
23
|
gender: Schema.NullOr(Gender),
|
|
23
24
|
locale: Locale,
|
|
24
25
|
created_at: Model.DateTimeInsertFromDate,
|
package/src/rpc/SyncRpcs.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { RpcGroup } from '@effect/rpc';
|
|
2
2
|
import { ChannelRpcGroup } from './channel/ChannelRpcGroup.js';
|
|
3
|
+
import { EventRpcGroup } from './event/EventRpcGroup.js';
|
|
3
4
|
import { GuildRpcGroup } from './guild/GuildRpcGroup.js';
|
|
4
5
|
import { RoleRpcGroup } from './role/RoleRpcGroup.js';
|
|
5
6
|
|
|
6
|
-
export class SyncRpcs extends RpcGroup.make().merge(
|
|
7
|
+
export class SyncRpcs extends RpcGroup.make().merge(
|
|
8
|
+
RoleRpcGroup,
|
|
9
|
+
ChannelRpcGroup,
|
|
10
|
+
GuildRpcGroup,
|
|
11
|
+
EventRpcGroup,
|
|
12
|
+
) {}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Schema } from 'effect';
|
|
2
|
+
import { Discord, Event, Team } from '~/index.js';
|
|
3
|
+
|
|
4
|
+
export class EventCreatedEvent extends Schema.TaggedClass<EventCreatedEvent>()('event_created', {
|
|
5
|
+
id: Schema.String,
|
|
6
|
+
team_id: Team.TeamId,
|
|
7
|
+
guild_id: Discord.Snowflake,
|
|
8
|
+
event_id: Event.EventId,
|
|
9
|
+
title: Schema.String,
|
|
10
|
+
description: Schema.NullOr(Schema.String),
|
|
11
|
+
start_at: Schema.String,
|
|
12
|
+
end_at: Schema.NullOr(Schema.String),
|
|
13
|
+
location: Schema.NullOr(Schema.String),
|
|
14
|
+
event_type: Schema.String,
|
|
15
|
+
discord_channel_id: Schema.NullOr(Schema.String),
|
|
16
|
+
}) {}
|
|
17
|
+
|
|
18
|
+
export class EventUpdatedEvent extends Schema.TaggedClass<EventUpdatedEvent>()('event_updated', {
|
|
19
|
+
id: Schema.String,
|
|
20
|
+
team_id: Team.TeamId,
|
|
21
|
+
guild_id: Discord.Snowflake,
|
|
22
|
+
event_id: Event.EventId,
|
|
23
|
+
title: Schema.String,
|
|
24
|
+
description: Schema.NullOr(Schema.String),
|
|
25
|
+
start_at: Schema.String,
|
|
26
|
+
end_at: Schema.NullOr(Schema.String),
|
|
27
|
+
location: Schema.NullOr(Schema.String),
|
|
28
|
+
event_type: Schema.String,
|
|
29
|
+
discord_channel_id: Schema.NullOr(Schema.String),
|
|
30
|
+
}) {}
|
|
31
|
+
|
|
32
|
+
export class EventCancelledEvent extends Schema.TaggedClass<EventCancelledEvent>()(
|
|
33
|
+
'event_cancelled',
|
|
34
|
+
{
|
|
35
|
+
id: Schema.String,
|
|
36
|
+
team_id: Team.TeamId,
|
|
37
|
+
guild_id: Discord.Snowflake,
|
|
38
|
+
event_id: Event.EventId,
|
|
39
|
+
},
|
|
40
|
+
) {}
|
|
41
|
+
|
|
42
|
+
export const UnprocessedEventSyncEvent = Schema.Union(
|
|
43
|
+
EventCreatedEvent,
|
|
44
|
+
EventUpdatedEvent,
|
|
45
|
+
EventCancelledEvent,
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
export type UnprocessedEventSyncEvent = Schema.Schema.Type<typeof UnprocessedEventSyncEvent>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Rpc, RpcGroup } from '@effect/rpc';
|
|
2
|
+
import { Schema } from 'effect';
|
|
3
|
+
import { Discord, Event, EventRsvp, Team } from '~/index.js';
|
|
4
|
+
import { UnprocessedEventSyncEvent } from './EventRpcEvents.js';
|
|
5
|
+
import {
|
|
6
|
+
EventDiscordMessage,
|
|
7
|
+
EventEmbedInfo,
|
|
8
|
+
RsvpAttendeesResult,
|
|
9
|
+
RsvpCountsResult,
|
|
10
|
+
RsvpDeadlinePassed,
|
|
11
|
+
RsvpEventNotFound,
|
|
12
|
+
RsvpMemberNotFound,
|
|
13
|
+
} from './EventRpcModels.js';
|
|
14
|
+
|
|
15
|
+
export const EventRpcGroup = RpcGroup.make(
|
|
16
|
+
Rpc.make('GetUnprocessedEvents', {
|
|
17
|
+
payload: { limit: Schema.Number },
|
|
18
|
+
success: Schema.Array(UnprocessedEventSyncEvent),
|
|
19
|
+
}),
|
|
20
|
+
Rpc.make('MarkEventProcessed', {
|
|
21
|
+
payload: { id: Schema.String },
|
|
22
|
+
}),
|
|
23
|
+
Rpc.make('MarkEventFailed', {
|
|
24
|
+
payload: { id: Schema.String, error: Schema.String },
|
|
25
|
+
}),
|
|
26
|
+
Rpc.make('SaveDiscordMessageId', {
|
|
27
|
+
payload: {
|
|
28
|
+
event_id: Event.EventId,
|
|
29
|
+
discord_channel_id: Schema.String,
|
|
30
|
+
discord_message_id: Schema.String,
|
|
31
|
+
},
|
|
32
|
+
}),
|
|
33
|
+
Rpc.make('GetDiscordMessageId', {
|
|
34
|
+
payload: { event_id: Event.EventId },
|
|
35
|
+
success: Schema.OptionFromNullOr(EventDiscordMessage),
|
|
36
|
+
}),
|
|
37
|
+
Rpc.make('SubmitRsvp', {
|
|
38
|
+
payload: {
|
|
39
|
+
event_id: Event.EventId,
|
|
40
|
+
team_id: Team.TeamId,
|
|
41
|
+
discord_user_id: Discord.Snowflake,
|
|
42
|
+
response: EventRsvp.RsvpResponse,
|
|
43
|
+
message: Schema.NullOr(Schema.String),
|
|
44
|
+
},
|
|
45
|
+
success: RsvpCountsResult,
|
|
46
|
+
error: Schema.Union(RsvpMemberNotFound, RsvpDeadlinePassed, RsvpEventNotFound),
|
|
47
|
+
}),
|
|
48
|
+
Rpc.make('GetRsvpCounts', {
|
|
49
|
+
payload: { event_id: Event.EventId },
|
|
50
|
+
success: RsvpCountsResult,
|
|
51
|
+
}),
|
|
52
|
+
Rpc.make('GetEventEmbedInfo', {
|
|
53
|
+
payload: { event_id: Event.EventId },
|
|
54
|
+
success: Schema.OptionFromNullOr(EventEmbedInfo),
|
|
55
|
+
}),
|
|
56
|
+
Rpc.make('GetRsvpAttendees', {
|
|
57
|
+
payload: { event_id: Event.EventId, offset: Schema.Number, limit: Schema.Number },
|
|
58
|
+
success: RsvpAttendeesResult,
|
|
59
|
+
}),
|
|
60
|
+
).prefix('Event/');
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Schema } from 'effect';
|
|
2
|
+
|
|
3
|
+
export class EventDiscordMessage extends Schema.Class<EventDiscordMessage>('EventDiscordMessage')({
|
|
4
|
+
discord_channel_id: Schema.String,
|
|
5
|
+
discord_message_id: Schema.String,
|
|
6
|
+
}) {}
|
|
7
|
+
|
|
8
|
+
export class RsvpCountsResult extends Schema.Class<RsvpCountsResult>('RsvpCountsResult')({
|
|
9
|
+
yesCount: Schema.Number,
|
|
10
|
+
noCount: Schema.Number,
|
|
11
|
+
maybeCount: Schema.Number,
|
|
12
|
+
canRsvp: Schema.Boolean,
|
|
13
|
+
}) {}
|
|
14
|
+
|
|
15
|
+
export class EventEmbedInfo extends Schema.Class<EventEmbedInfo>('EventEmbedInfo')({
|
|
16
|
+
title: Schema.String,
|
|
17
|
+
description: Schema.OptionFromNullOr(Schema.String),
|
|
18
|
+
start_at: Schema.String,
|
|
19
|
+
end_at: Schema.OptionFromNullOr(Schema.String),
|
|
20
|
+
location: Schema.OptionFromNullOr(Schema.String),
|
|
21
|
+
event_type: Schema.String,
|
|
22
|
+
}) {}
|
|
23
|
+
|
|
24
|
+
export class RsvpMemberNotFound extends Schema.TaggedError<RsvpMemberNotFound>()(
|
|
25
|
+
'RsvpMemberNotFound',
|
|
26
|
+
{},
|
|
27
|
+
) {}
|
|
28
|
+
|
|
29
|
+
export class RsvpDeadlinePassed extends Schema.TaggedError<RsvpDeadlinePassed>()(
|
|
30
|
+
'RsvpDeadlinePassed',
|
|
31
|
+
{},
|
|
32
|
+
) {}
|
|
33
|
+
|
|
34
|
+
export class RsvpEventNotFound extends Schema.TaggedError<RsvpEventNotFound>()(
|
|
35
|
+
'RsvpEventNotFound',
|
|
36
|
+
{},
|
|
37
|
+
) {}
|
|
38
|
+
|
|
39
|
+
export class RsvpAttendeeEntry extends Schema.Class<RsvpAttendeeEntry>('RsvpAttendeeEntry')({
|
|
40
|
+
discord_id: Schema.NullOr(Schema.String),
|
|
41
|
+
name: Schema.NullOr(Schema.String),
|
|
42
|
+
response: Schema.Literal('yes', 'no', 'maybe'),
|
|
43
|
+
message: Schema.NullOr(Schema.String),
|
|
44
|
+
}) {}
|
|
45
|
+
|
|
46
|
+
export class RsvpAttendeesResult extends Schema.Class<RsvpAttendeesResult>('RsvpAttendeesResult')({
|
|
47
|
+
attendees: Schema.Array(RsvpAttendeeEntry),
|
|
48
|
+
total: Schema.Number,
|
|
49
|
+
}) {}
|