@sideline/domain 0.4.0 → 0.5.0

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.
Files changed (150) hide show
  1. package/dist/cjs/api/AgeThresholdApi.js +14 -14
  2. package/dist/cjs/api/AgeThresholdApi.js.map +1 -1
  3. package/dist/cjs/api/Auth.js +14 -2
  4. package/dist/cjs/api/Auth.js.map +1 -1
  5. package/dist/cjs/api/GroupApi.js +205 -0
  6. package/dist/cjs/api/GroupApi.js.map +1 -0
  7. package/dist/cjs/api/NotificationApi.js +6 -2
  8. package/dist/cjs/api/NotificationApi.js.map +1 -1
  9. package/dist/cjs/api/TrainingTypeApi.js +9 -40
  10. package/dist/cjs/api/TrainingTypeApi.js.map +1 -1
  11. package/dist/cjs/index.js +9 -5
  12. package/dist/cjs/models/AgeThresholdRule.js +2 -2
  13. package/dist/cjs/models/AgeThresholdRule.js.map +1 -1
  14. package/dist/cjs/models/ChannelSyncEvent.js +3 -3
  15. package/dist/cjs/models/ChannelSyncEvent.js.map +1 -1
  16. package/dist/cjs/models/DiscordChannelMapping.js +2 -2
  17. package/dist/cjs/models/DiscordChannelMapping.js.map +1 -1
  18. package/dist/cjs/models/GroupModel.js +20 -0
  19. package/dist/cjs/models/GroupModel.js.map +1 -0
  20. package/dist/cjs/models/Notification.js +1 -1
  21. package/dist/cjs/models/Notification.js.map +1 -1
  22. package/dist/cjs/models/Role.js +2 -2
  23. package/dist/cjs/models/Role.js.map +1 -1
  24. package/dist/cjs/models/RoleGroup.js +15 -0
  25. package/dist/cjs/models/RoleGroup.js.map +1 -0
  26. package/dist/cjs/models/Team.js +2 -0
  27. package/dist/cjs/models/Team.js.map +1 -1
  28. package/dist/cjs/models/TrainingType.js +2 -0
  29. package/dist/cjs/models/TrainingType.js.map +1 -1
  30. package/dist/cjs/rpc/SyncRpcs.js +2 -1
  31. package/dist/cjs/rpc/SyncRpcs.js.map +1 -1
  32. package/dist/cjs/rpc/channel/ChannelRpcEvents.js +6 -6
  33. package/dist/cjs/rpc/channel/ChannelRpcEvents.js.map +1 -1
  34. package/dist/cjs/rpc/channel/ChannelRpcGroup.js +3 -3
  35. package/dist/cjs/rpc/channel/ChannelRpcGroup.js.map +1 -1
  36. package/dist/cjs/rpc/channel/ChannelRpcModels.js +1 -1
  37. package/dist/cjs/rpc/channel/ChannelRpcModels.js.map +1 -1
  38. package/dist/cjs/rpc/guild/GuildRpcGroup.js +35 -0
  39. package/dist/cjs/rpc/guild/GuildRpcGroup.js.map +1 -0
  40. package/dist/dts/api/AgeThresholdApi.d.ts +25 -25
  41. package/dist/dts/api/AgeThresholdApi.d.ts.map +1 -1
  42. package/dist/dts/api/Auth.d.ts +33 -4
  43. package/dist/dts/api/Auth.d.ts.map +1 -1
  44. package/dist/dts/api/GroupApi.d.ts +254 -0
  45. package/dist/dts/api/GroupApi.d.ts.map +1 -0
  46. package/dist/dts/api/NotificationApi.d.ts +9 -5
  47. package/dist/dts/api/NotificationApi.d.ts.map +1 -1
  48. package/dist/dts/api/RoleApi.d.ts +10 -10
  49. package/dist/dts/api/Roster.d.ts +5 -5
  50. package/dist/dts/api/TrainingTypeApi.d.ts +17 -42
  51. package/dist/dts/api/TrainingTypeApi.d.ts.map +1 -1
  52. package/dist/dts/index.d.ts +4 -2
  53. package/dist/dts/index.d.ts.map +1 -1
  54. package/dist/dts/models/AgeThresholdRule.d.ts +13 -13
  55. package/dist/dts/models/ChannelSyncEvent.d.ts +28 -28
  56. package/dist/dts/models/DiscordChannelMapping.d.ts +11 -11
  57. package/dist/dts/models/{SubgroupModel.d.ts → GroupModel.d.ts} +39 -13
  58. package/dist/dts/models/GroupModel.d.ts.map +1 -0
  59. package/dist/dts/models/Notification.d.ts +12 -12
  60. package/dist/dts/models/Notification.d.ts.map +1 -1
  61. package/dist/dts/models/Role.d.ts +4 -4
  62. package/dist/dts/models/Role.d.ts.map +1 -1
  63. package/dist/dts/models/RoleGroup.d.ts +16 -0
  64. package/dist/dts/models/RoleGroup.d.ts.map +1 -0
  65. package/dist/dts/models/RoleSyncEvent.d.ts +4 -4
  66. package/dist/dts/models/Team.d.ts +13 -0
  67. package/dist/dts/models/Team.d.ts.map +1 -1
  68. package/dist/dts/models/TrainingType.d.ts +13 -0
  69. package/dist/dts/models/TrainingType.d.ts.map +1 -1
  70. package/dist/dts/rpc/SyncRpcs.d.ts +18 -3
  71. package/dist/dts/rpc/SyncRpcs.d.ts.map +1 -1
  72. package/dist/dts/rpc/channel/ChannelRpcEvents.d.ts +6 -6
  73. package/dist/dts/rpc/channel/ChannelRpcGroup.d.ts +3 -3
  74. package/dist/dts/rpc/channel/ChannelRpcModels.d.ts +3 -3
  75. package/dist/dts/rpc/guild/GuildRpcGroup.d.ts +19 -0
  76. package/dist/dts/rpc/guild/GuildRpcGroup.d.ts.map +1 -0
  77. package/dist/esm/api/AgeThresholdApi.js +11 -11
  78. package/dist/esm/api/AgeThresholdApi.js.map +1 -1
  79. package/dist/esm/api/Auth.js +12 -1
  80. package/dist/esm/api/Auth.js.map +1 -1
  81. package/dist/esm/api/GroupApi.js +185 -0
  82. package/dist/esm/api/GroupApi.js.map +1 -0
  83. package/dist/esm/api/NotificationApi.js +6 -2
  84. package/dist/esm/api/NotificationApi.js.map +1 -1
  85. package/dist/esm/api/TrainingTypeApi.js +8 -37
  86. package/dist/esm/api/TrainingTypeApi.js.map +1 -1
  87. package/dist/esm/index.js +4 -2
  88. package/dist/esm/index.js.map +1 -1
  89. package/dist/esm/models/AgeThresholdRule.js +2 -2
  90. package/dist/esm/models/AgeThresholdRule.js.map +1 -1
  91. package/dist/esm/models/ChannelSyncEvent.js +3 -3
  92. package/dist/esm/models/ChannelSyncEvent.js.map +1 -1
  93. package/dist/esm/models/DiscordChannelMapping.js +2 -2
  94. package/dist/esm/models/DiscordChannelMapping.js.map +1 -1
  95. package/dist/esm/models/GroupModel.js +13 -0
  96. package/dist/esm/models/GroupModel.js.map +1 -0
  97. package/dist/esm/models/Notification.js +1 -1
  98. package/dist/esm/models/Notification.js.map +1 -1
  99. package/dist/esm/models/Role.js +2 -2
  100. package/dist/esm/models/Role.js.map +1 -1
  101. package/dist/esm/models/RoleGroup.js +8 -0
  102. package/dist/esm/models/RoleGroup.js.map +1 -0
  103. package/dist/esm/models/Team.js +2 -0
  104. package/dist/esm/models/Team.js.map +1 -1
  105. package/dist/esm/models/TrainingType.js +2 -0
  106. package/dist/esm/models/TrainingType.js.map +1 -1
  107. package/dist/esm/rpc/SyncRpcs.js +2 -1
  108. package/dist/esm/rpc/SyncRpcs.js.map +1 -1
  109. package/dist/esm/rpc/channel/ChannelRpcEvents.js +7 -7
  110. package/dist/esm/rpc/channel/ChannelRpcEvents.js.map +1 -1
  111. package/dist/esm/rpc/channel/ChannelRpcGroup.js +4 -4
  112. package/dist/esm/rpc/channel/ChannelRpcGroup.js.map +1 -1
  113. package/dist/esm/rpc/channel/ChannelRpcModels.js +2 -2
  114. package/dist/esm/rpc/channel/ChannelRpcModels.js.map +1 -1
  115. package/dist/esm/rpc/guild/GuildRpcGroup.js +29 -0
  116. package/dist/esm/rpc/guild/GuildRpcGroup.js.map +1 -0
  117. package/package.json +1 -1
  118. package/src/api/AgeThresholdApi.ts +12 -12
  119. package/src/api/Auth.ts +16 -0
  120. package/src/api/GroupApi.ts +229 -0
  121. package/src/api/NotificationApi.ts +10 -0
  122. package/src/api/TrainingTypeApi.ts +5 -52
  123. package/src/index.ts +7 -4
  124. package/src/models/AgeThresholdRule.ts +2 -2
  125. package/src/models/ChannelSyncEvent.ts +3 -3
  126. package/src/models/DiscordChannelMapping.ts +2 -2
  127. package/src/models/GroupModel.ts +15 -0
  128. package/src/models/Notification.ts +2 -2
  129. package/src/models/Role.ts +4 -0
  130. package/src/models/RoleGroup.ts +8 -0
  131. package/src/models/Team.ts +2 -0
  132. package/src/models/TrainingType.ts +2 -0
  133. package/src/rpc/SyncRpcs.ts +2 -1
  134. package/src/rpc/channel/ChannelRpcEvents.ts +7 -7
  135. package/src/rpc/channel/ChannelRpcGroup.ts +4 -4
  136. package/src/rpc/channel/ChannelRpcModels.ts +2 -2
  137. package/src/rpc/guild/GuildRpcGroup.ts +29 -0
  138. package/dist/cjs/api/SubgroupApi.js +0 -122
  139. package/dist/cjs/api/SubgroupApi.js.map +0 -1
  140. package/dist/cjs/models/SubgroupModel.js +0 -18
  141. package/dist/cjs/models/SubgroupModel.js.map +0 -1
  142. package/dist/dts/api/SubgroupApi.d.ts +0 -140
  143. package/dist/dts/api/SubgroupApi.d.ts.map +0 -1
  144. package/dist/dts/models/SubgroupModel.d.ts.map +0 -1
  145. package/dist/esm/api/SubgroupApi.js +0 -106
  146. package/dist/esm/api/SubgroupApi.js.map +0 -1
  147. package/dist/esm/models/SubgroupModel.js +0 -11
  148. package/dist/esm/models/SubgroupModel.js.map +0 -1
  149. package/src/api/SubgroupApi.ts +0 -146
  150. package/src/models/SubgroupModel.ts +0 -13
@@ -0,0 +1,229 @@
1
+ import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from '@effect/platform';
2
+ import { Schema } from 'effect';
3
+ import { AuthMiddleware } from '~/api/Auth.js';
4
+ import { Snowflake } from '~/models/Discord.js';
5
+ import { GroupId } from '~/models/GroupModel.js';
6
+ import { RoleId } from '~/models/Role.js';
7
+ import { TeamId } from '~/models/Team.js';
8
+ import { TeamMemberId } from '~/models/TeamMember.js';
9
+
10
+ export class GroupInfo extends Schema.Class<GroupInfo>('GroupInfo')({
11
+ groupId: GroupId,
12
+ teamId: TeamId,
13
+ parentId: Schema.NullOr(GroupId),
14
+ name: Schema.String,
15
+ emoji: Schema.NullOr(Schema.String),
16
+ memberCount: Schema.Number,
17
+ }) {}
18
+
19
+ export class GroupDetail extends Schema.Class<GroupDetail>('GroupDetail')({
20
+ groupId: GroupId,
21
+ teamId: TeamId,
22
+ parentId: Schema.NullOr(GroupId),
23
+ name: Schema.String,
24
+ emoji: Schema.NullOr(Schema.String),
25
+ roles: Schema.Array(
26
+ Schema.Struct({
27
+ roleId: RoleId,
28
+ roleName: Schema.String,
29
+ }),
30
+ ),
31
+ members: Schema.Array(
32
+ Schema.Struct({
33
+ memberId: TeamMemberId,
34
+ name: Schema.NullOr(Schema.String),
35
+ discordUsername: Schema.String,
36
+ }),
37
+ ),
38
+ }) {}
39
+
40
+ export class CreateGroupRequest extends Schema.Class<CreateGroupRequest>('CreateGroupRequest')({
41
+ name: Schema.NonEmptyString,
42
+ parentId: Schema.NullOr(GroupId),
43
+ emoji: Schema.NullOr(Schema.String),
44
+ }) {}
45
+
46
+ export class UpdateGroupRequest extends Schema.Class<UpdateGroupRequest>('UpdateGroupRequest')({
47
+ name: Schema.NonEmptyString,
48
+ emoji: Schema.NullOr(Schema.String),
49
+ }) {}
50
+
51
+ export class AddGroupMemberRequest extends Schema.Class<AddGroupMemberRequest>(
52
+ 'AddGroupMemberRequest',
53
+ )({
54
+ memberId: TeamMemberId,
55
+ }) {}
56
+
57
+ export class AssignGroupRoleRequest extends Schema.Class<AssignGroupRoleRequest>(
58
+ 'AssignGroupRoleRequest',
59
+ )({
60
+ roleId: RoleId,
61
+ }) {}
62
+
63
+ export class MoveGroupRequest extends Schema.Class<MoveGroupRequest>('MoveGroupRequest')({
64
+ parentId: Schema.NullOr(GroupId),
65
+ }) {}
66
+
67
+ export class ChannelMappingInfo extends Schema.Class<ChannelMappingInfo>('ChannelMappingInfo')({
68
+ discordChannelId: Snowflake,
69
+ discordChannelName: Schema.NullOr(Schema.String),
70
+ discordRoleId: Schema.NullOr(Snowflake),
71
+ }) {}
72
+
73
+ export class SetChannelMappingRequest extends Schema.Class<SetChannelMappingRequest>(
74
+ 'SetChannelMappingRequest',
75
+ )({
76
+ discordChannelId: Snowflake,
77
+ }) {}
78
+
79
+ export class DiscordChannelInfo extends Schema.Class<DiscordChannelInfo>('DiscordChannelInfo')({
80
+ id: Snowflake,
81
+ name: Schema.String,
82
+ type: Schema.Number,
83
+ parentId: Schema.NullOr(Snowflake),
84
+ }) {}
85
+
86
+ export class GroupNotFound extends Schema.TaggedError<GroupNotFound>()(
87
+ 'GroupNotFound',
88
+ {},
89
+ HttpApiSchema.annotations({ status: 404 }),
90
+ ) {}
91
+
92
+ export class Forbidden extends Schema.TaggedError<Forbidden>()(
93
+ 'GroupForbidden',
94
+ {},
95
+ HttpApiSchema.annotations({ status: 403 }),
96
+ ) {}
97
+
98
+ export class MemberNotFound extends Schema.TaggedError<MemberNotFound>()(
99
+ 'GroupMemberNotFound',
100
+ {},
101
+ HttpApiSchema.annotations({ status: 404 }),
102
+ ) {}
103
+
104
+ export class GroupApiGroup extends HttpApiGroup.make('group')
105
+ .add(
106
+ HttpApiEndpoint.get('listGroups', '/teams/:teamId/groups')
107
+ .addSuccess(Schema.Array(GroupInfo))
108
+ .addError(Forbidden, { status: 403 })
109
+ .setPath(Schema.Struct({ teamId: TeamId }))
110
+ .middleware(AuthMiddleware),
111
+ )
112
+ .add(
113
+ HttpApiEndpoint.post('createGroup', '/teams/:teamId/groups')
114
+ .addSuccess(GroupInfo, { status: 201 })
115
+ .addError(Forbidden, { status: 403 })
116
+ .setPath(Schema.Struct({ teamId: TeamId }))
117
+ .setPayload(CreateGroupRequest)
118
+ .middleware(AuthMiddleware),
119
+ )
120
+ .add(
121
+ HttpApiEndpoint.get('getGroup', '/teams/:teamId/groups/:groupId')
122
+ .addSuccess(GroupDetail)
123
+ .addError(Forbidden, { status: 403 })
124
+ .addError(GroupNotFound, { status: 404 })
125
+ .setPath(Schema.Struct({ teamId: TeamId, groupId: GroupId }))
126
+ .middleware(AuthMiddleware),
127
+ )
128
+ .add(
129
+ HttpApiEndpoint.patch('updateGroup', '/teams/:teamId/groups/:groupId')
130
+ .addSuccess(GroupInfo)
131
+ .addError(Forbidden, { status: 403 })
132
+ .addError(GroupNotFound, { status: 404 })
133
+ .setPath(Schema.Struct({ teamId: TeamId, groupId: GroupId }))
134
+ .setPayload(UpdateGroupRequest)
135
+ .middleware(AuthMiddleware),
136
+ )
137
+ .add(
138
+ HttpApiEndpoint.del('deleteGroup', '/teams/:teamId/groups/:groupId')
139
+ .addSuccess(Schema.Void)
140
+ .addError(Forbidden, { status: 403 })
141
+ .addError(GroupNotFound, { status: 404 })
142
+ .setPath(Schema.Struct({ teamId: TeamId, groupId: GroupId }))
143
+ .middleware(AuthMiddleware),
144
+ )
145
+ .add(
146
+ HttpApiEndpoint.post('addGroupMember', '/teams/:teamId/groups/:groupId/members')
147
+ .addSuccess(Schema.Void, { status: 204 })
148
+ .addError(Forbidden, { status: 403 })
149
+ .addError(GroupNotFound, { status: 404 })
150
+ .addError(MemberNotFound, { status: 404 })
151
+ .setPath(Schema.Struct({ teamId: TeamId, groupId: GroupId }))
152
+ .setPayload(AddGroupMemberRequest)
153
+ .middleware(AuthMiddleware),
154
+ )
155
+ .add(
156
+ HttpApiEndpoint.del('removeGroupMember', '/teams/:teamId/groups/:groupId/members/:memberId')
157
+ .addSuccess(Schema.Void)
158
+ .addError(Forbidden, { status: 403 })
159
+ .addError(GroupNotFound, { status: 404 })
160
+ .addError(MemberNotFound, { status: 404 })
161
+ .setPath(Schema.Struct({ teamId: TeamId, groupId: GroupId, memberId: TeamMemberId }))
162
+ .middleware(AuthMiddleware),
163
+ )
164
+ .add(
165
+ HttpApiEndpoint.post('assignGroupRole', '/teams/:teamId/groups/:groupId/roles')
166
+ .addSuccess(Schema.Void, { status: 204 })
167
+ .addError(Forbidden, { status: 403 })
168
+ .addError(GroupNotFound, { status: 404 })
169
+ .setPath(Schema.Struct({ teamId: TeamId, groupId: GroupId }))
170
+ .setPayload(AssignGroupRoleRequest)
171
+ .middleware(AuthMiddleware),
172
+ )
173
+ .add(
174
+ HttpApiEndpoint.del('unassignGroupRole', '/teams/:teamId/groups/:groupId/roles/:roleId')
175
+ .addSuccess(Schema.Void)
176
+ .addError(Forbidden, { status: 403 })
177
+ .addError(GroupNotFound, { status: 404 })
178
+ .setPath(Schema.Struct({ teamId: TeamId, groupId: GroupId, roleId: RoleId }))
179
+ .middleware(AuthMiddleware),
180
+ )
181
+ .add(
182
+ HttpApiEndpoint.patch('moveGroup', '/teams/:teamId/groups/:groupId/parent')
183
+ .addSuccess(GroupInfo)
184
+ .addError(Forbidden, { status: 403 })
185
+ .addError(GroupNotFound, { status: 404 })
186
+ .setPath(Schema.Struct({ teamId: TeamId, groupId: GroupId }))
187
+ .setPayload(MoveGroupRequest)
188
+ .middleware(AuthMiddleware),
189
+ )
190
+ .add(
191
+ HttpApiEndpoint.get('getChannelMapping', '/teams/:teamId/groups/:groupId/channel-mapping')
192
+ .addSuccess(Schema.NullOr(ChannelMappingInfo))
193
+ .addError(Forbidden, { status: 403 })
194
+ .addError(GroupNotFound, { status: 404 })
195
+ .setPath(Schema.Struct({ teamId: TeamId, groupId: GroupId }))
196
+ .middleware(AuthMiddleware),
197
+ )
198
+ .add(
199
+ HttpApiEndpoint.put('setChannelMapping', '/teams/:teamId/groups/:groupId/channel-mapping')
200
+ .addSuccess(ChannelMappingInfo)
201
+ .addError(Forbidden, { status: 403 })
202
+ .addError(GroupNotFound, { status: 404 })
203
+ .setPath(Schema.Struct({ teamId: TeamId, groupId: GroupId }))
204
+ .setPayload(SetChannelMappingRequest)
205
+ .middleware(AuthMiddleware),
206
+ )
207
+ .add(
208
+ HttpApiEndpoint.del('deleteChannelMapping', '/teams/:teamId/groups/:groupId/channel-mapping')
209
+ .addSuccess(Schema.Void)
210
+ .addError(Forbidden, { status: 403 })
211
+ .addError(GroupNotFound, { status: 404 })
212
+ .setPath(Schema.Struct({ teamId: TeamId, groupId: GroupId }))
213
+ .middleware(AuthMiddleware),
214
+ )
215
+ .add(
216
+ HttpApiEndpoint.post('createChannel', '/teams/:teamId/groups/:groupId/create-channel')
217
+ .addSuccess(Schema.Void, { status: 201 })
218
+ .addError(Forbidden, { status: 403 })
219
+ .addError(GroupNotFound, { status: 404 })
220
+ .setPath(Schema.Struct({ teamId: TeamId, groupId: GroupId }))
221
+ .middleware(AuthMiddleware),
222
+ )
223
+ .add(
224
+ HttpApiEndpoint.get('listDiscordChannels', '/teams/:teamId/discord-channels')
225
+ .addSuccess(Schema.Array(DiscordChannelInfo))
226
+ .addError(Forbidden, { status: 403 })
227
+ .setPath(Schema.Struct({ teamId: TeamId }))
228
+ .middleware(AuthMiddleware),
229
+ ) {}
@@ -31,6 +31,11 @@ export class NotificationApiGroup extends HttpApiGroup.make('notification')
31
31
  HttpApiEndpoint.get('listNotifications', '/notifications')
32
32
  .addSuccess(Schema.Array(NotificationInfo))
33
33
  .addError(Forbidden, { status: 403 })
34
+ .setUrlParams(
35
+ Schema.Struct({
36
+ teamId: TeamId,
37
+ }),
38
+ )
34
39
  .middleware(AuthMiddleware),
35
40
  )
36
41
  .add(
@@ -45,5 +50,10 @@ export class NotificationApiGroup extends HttpApiGroup.make('notification')
45
50
  HttpApiEndpoint.post('markAllAsRead', '/notifications/read-all')
46
51
  .addSuccess(Schema.Void)
47
52
  .addError(Forbidden, { status: 403 })
53
+ .setPayload(
54
+ Schema.Struct({
55
+ teamId: TeamId,
56
+ }),
57
+ )
48
58
  .middleware(AuthMiddleware),
49
59
  ) {}
@@ -1,29 +1,24 @@
1
1
  import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from '@effect/platform';
2
2
  import { Schema } from 'effect';
3
3
  import { AuthMiddleware } from '~/api/Auth.js';
4
+ import { GroupId } from '~/models/GroupModel.js';
4
5
  import { TeamId } from '~/models/Team.js';
5
- import { TeamMemberId } from '~/models/TeamMember.js';
6
6
  import { TrainingTypeId } from '~/models/TrainingType.js';
7
7
 
8
8
  export class TrainingTypeInfo extends Schema.Class<TrainingTypeInfo>('TrainingTypeInfo')({
9
9
  trainingTypeId: TrainingTypeId,
10
10
  teamId: TeamId,
11
11
  name: Schema.String,
12
- coachCount: Schema.Number,
12
+ groupName: Schema.NullOr(Schema.String),
13
13
  }) {}
14
14
 
15
15
  export class TrainingTypeDetail extends Schema.Class<TrainingTypeDetail>('TrainingTypeDetail')({
16
16
  trainingTypeId: TrainingTypeId,
17
17
  teamId: TeamId,
18
18
  name: Schema.String,
19
+ groupId: Schema.NullOr(GroupId),
20
+ groupName: Schema.NullOr(Schema.String),
19
21
  canAdmin: Schema.Boolean,
20
- coaches: Schema.Array(
21
- Schema.Struct({
22
- memberId: TeamMemberId,
23
- name: Schema.NullOr(Schema.String),
24
- discordUsername: Schema.String,
25
- }),
26
- ),
27
22
  }) {}
28
23
 
29
24
  export class TrainingTypeListResponse extends Schema.Class<TrainingTypeListResponse>(
@@ -37,6 +32,7 @@ export class CreateTrainingTypeRequest extends Schema.Class<CreateTrainingTypeRe
37
32
  'CreateTrainingTypeRequest',
38
33
  )({
39
34
  name: Schema.NonEmptyString,
35
+ groupId: Schema.NullOr(GroupId),
40
36
  }) {}
41
37
 
42
38
  export class UpdateTrainingTypeRequest extends Schema.Class<UpdateTrainingTypeRequest>(
@@ -45,12 +41,6 @@ export class UpdateTrainingTypeRequest extends Schema.Class<UpdateTrainingTypeRe
45
41
  name: Schema.NonEmptyString,
46
42
  }) {}
47
43
 
48
- export class AddTrainingTypeCoachRequest extends Schema.Class<AddTrainingTypeCoachRequest>(
49
- 'AddTrainingTypeCoachRequest',
50
- )({
51
- memberId: TeamMemberId,
52
- }) {}
53
-
54
44
  export class TrainingTypeNotFound extends Schema.TaggedError<TrainingTypeNotFound>()(
55
45
  'TrainingTypeNotFound',
56
46
  {},
@@ -63,12 +53,6 @@ export class Forbidden extends Schema.TaggedError<Forbidden>()(
63
53
  HttpApiSchema.annotations({ status: 403 }),
64
54
  ) {}
65
55
 
66
- export class MemberNotFound extends Schema.TaggedError<MemberNotFound>()(
67
- 'TrainingTypeMemberNotFound',
68
- {},
69
- HttpApiSchema.annotations({ status: 404 }),
70
- ) {}
71
-
72
56
  export class TrainingTypeApiGroup extends HttpApiGroup.make('trainingType')
73
57
  .add(
74
58
  HttpApiEndpoint.get('listTrainingTypes', '/teams/:teamId/training-types')
@@ -109,35 +93,4 @@ export class TrainingTypeApiGroup extends HttpApiGroup.make('trainingType')
109
93
  .addError(TrainingTypeNotFound, { status: 404 })
110
94
  .setPath(Schema.Struct({ teamId: TeamId, trainingTypeId: TrainingTypeId }))
111
95
  .middleware(AuthMiddleware),
112
- )
113
- .add(
114
- HttpApiEndpoint.post(
115
- 'addTrainingTypeCoach',
116
- '/teams/:teamId/training-types/:trainingTypeId/coaches',
117
- )
118
- .addSuccess(Schema.Void, { status: 204 })
119
- .addError(Forbidden, { status: 403 })
120
- .addError(TrainingTypeNotFound, { status: 404 })
121
- .addError(MemberNotFound, { status: 404 })
122
- .setPath(Schema.Struct({ teamId: TeamId, trainingTypeId: TrainingTypeId }))
123
- .setPayload(AddTrainingTypeCoachRequest)
124
- .middleware(AuthMiddleware),
125
- )
126
- .add(
127
- HttpApiEndpoint.del(
128
- 'removeTrainingTypeCoach',
129
- '/teams/:teamId/training-types/:trainingTypeId/coaches/:memberId',
130
- )
131
- .addSuccess(Schema.Void)
132
- .addError(Forbidden, { status: 403 })
133
- .addError(TrainingTypeNotFound, { status: 404 })
134
- .addError(MemberNotFound, { status: 404 })
135
- .setPath(
136
- Schema.Struct({
137
- teamId: TeamId,
138
- trainingTypeId: TrainingTypeId,
139
- memberId: TeamMemberId,
140
- }),
141
- )
142
- .middleware(AuthMiddleware),
143
96
  ) {}
package/src/index.ts CHANGED
@@ -4,6 +4,8 @@ export * as AgeThresholdApi from './api/AgeThresholdApi.js';
4
4
 
5
5
  export * as Auth from './api/Auth.js';
6
6
 
7
+ export * as GroupApi from './api/GroupApi.js';
8
+
7
9
  export * as Invite from './api/Invite.js';
8
10
 
9
11
  export * as NotificationApi from './api/NotificationApi.js';
@@ -12,8 +14,6 @@ export * as RoleApi from './api/RoleApi.js';
12
14
 
13
15
  export * as Roster from './api/Roster.js';
14
16
 
15
- export * as SubgroupApi from './api/SubgroupApi.js';
16
-
17
17
  export * as TrainingTypeApi from './api/TrainingTypeApi.js';
18
18
 
19
19
  export * as AgeThresholdRule from './models/AgeThresholdRule.js';
@@ -26,12 +26,16 @@ export * as DiscordChannelMapping from './models/DiscordChannelMapping.js';
26
26
 
27
27
  export * as DiscordRoleMapping from './models/DiscordRoleMapping.js';
28
28
 
29
+ export * as GroupModel from './models/GroupModel.js';
30
+
29
31
  export * as MemberRole from './models/MemberRole.js';
30
32
 
31
33
  export * as Notification from './models/Notification.js';
32
34
 
33
35
  export * as Role from './models/Role.js';
34
36
 
37
+ export * as RoleGroup from './models/RoleGroup.js';
38
+
35
39
  export * as RoleSyncEvent from './models/RoleSyncEvent.js';
36
40
 
37
41
  export * as RosterMemberModel from './models/RosterMemberModel.js';
@@ -40,8 +44,6 @@ export * as RosterModel from './models/RosterModel.js';
40
44
 
41
45
  export * as Session from './models/Session.js';
42
46
 
43
- export * as SubgroupModel from './models/SubgroupModel.js';
44
-
45
47
  export * as Team from './models/Team.js';
46
48
 
47
49
  export * as TeamInvite from './models/TeamInvite.js';
@@ -54,6 +56,7 @@ export * as User from './models/User.js';
54
56
  export * as ChannelRpcEvents from './rpc/channel/ChannelRpcEvents.js';
55
57
  export * as ChannelRpcGroup from './rpc/channel/ChannelRpcGroup.js';
56
58
  export * as ChannelRpcModels from './rpc/channel/ChannelRpcModels.js';
59
+ export * as GuildRpcGroup from './rpc/guild/GuildRpcGroup.js';
57
60
  export * as RoleRpcEvents from './rpc/role/RoleRpcEvents.js';
58
61
  export * as RoleRpcGroup from './rpc/role/RoleRpcGroup.js';
59
62
  export * as RoleRpcModels from './rpc/role/RoleRpcModels.js';
@@ -1,6 +1,6 @@
1
1
  import { Model } from '@effect/sql';
2
2
  import { Schema } from 'effect';
3
- import { RoleId } from '~/models/Role.js';
3
+ import { GroupId } from '~/models/GroupModel.js';
4
4
  import { TeamId } from '~/models/Team.js';
5
5
 
6
6
  export const AgeThresholdRuleId = Schema.String.pipe(Schema.brand('AgeThresholdRuleId'));
@@ -9,7 +9,7 @@ export type AgeThresholdRuleId = typeof AgeThresholdRuleId.Type;
9
9
  export class AgeThresholdRule extends Model.Class<AgeThresholdRule>('AgeThresholdRule')({
10
10
  id: Model.Generated(AgeThresholdRuleId),
11
11
  team_id: TeamId,
12
- role_id: RoleId,
12
+ group_id: GroupId,
13
13
  min_age: Schema.NullOr(Schema.Number),
14
14
  max_age: Schema.NullOr(Schema.Number),
15
15
  created_at: Model.DateTimeInsertFromDate,
@@ -1,6 +1,6 @@
1
1
  import { Model } from '@effect/sql';
2
2
  import { Schema } from 'effect';
3
- import { SubgroupId } from '~/models/SubgroupModel.js';
3
+ import { GroupId } from '~/models/GroupModel.js';
4
4
  import { TeamId } from '~/models/Team.js';
5
5
  import { TeamMemberId } from '~/models/TeamMember.js';
6
6
 
@@ -20,8 +20,8 @@ export class ChannelSyncEvent extends Model.Class<ChannelSyncEvent>('ChannelSync
20
20
  team_id: TeamId,
21
21
  guild_id: Schema.String,
22
22
  event_type: ChannelSyncEventType,
23
- subgroup_id: SubgroupId,
24
- subgroup_name: Schema.NullOr(Schema.String),
23
+ group_id: GroupId,
24
+ group_name: Schema.NullOr(Schema.String),
25
25
  team_member_id: Schema.NullOr(TeamMemberId),
26
26
  discord_user_id: Schema.NullOr(Schema.String),
27
27
  processed_at: Schema.NullOr(Schema.String),
@@ -1,6 +1,6 @@
1
1
  import { Model } from '@effect/sql';
2
2
  import { Schema } from 'effect';
3
- import { SubgroupId } from '~/models/SubgroupModel.js';
3
+ import { GroupId } from '~/models/GroupModel.js';
4
4
  import { TeamId } from '~/models/Team.js';
5
5
 
6
6
  export const DiscordChannelMappingId = Schema.String.pipe(Schema.brand('DiscordChannelMappingId'));
@@ -11,7 +11,7 @@ export class DiscordChannelMapping extends Model.Class<DiscordChannelMapping>(
11
11
  )({
12
12
  id: Model.Generated(DiscordChannelMappingId),
13
13
  team_id: TeamId,
14
- subgroup_id: SubgroupId,
14
+ group_id: GroupId,
15
15
  discord_channel_id: Schema.String,
16
16
  discord_role_id: Schema.OptionFromNullOr(Schema.String),
17
17
  created_at: Model.DateTimeInsertFromDate,
@@ -0,0 +1,15 @@
1
+ import { Model } from '@effect/sql';
2
+ import { Schema } from 'effect';
3
+ import { TeamId } from '~/models/Team.js';
4
+
5
+ export const GroupId = Schema.String.pipe(Schema.brand('GroupId'));
6
+ export type GroupId = typeof GroupId.Type;
7
+
8
+ export class Group extends Model.Class<Group>('Group')({
9
+ id: Model.Generated(GroupId),
10
+ team_id: TeamId,
11
+ parent_id: Schema.NullOr(GroupId),
12
+ name: Schema.String,
13
+ emoji: Schema.NullOr(Schema.String),
14
+ created_at: Model.DateTimeInsertFromDate,
15
+ }) {}
@@ -7,8 +7,8 @@ export const NotificationId = Schema.String.pipe(Schema.brand('NotificationId'))
7
7
  export type NotificationId = typeof NotificationId.Type;
8
8
 
9
9
  export const NotificationType = Schema.Literal(
10
- 'age_role_assigned',
11
- 'age_role_removed',
10
+ 'age_group_added',
11
+ 'age_group_removed',
12
12
  'role_assigned',
13
13
  'role_removed',
14
14
  );
@@ -15,6 +15,8 @@ export const Permission = Schema.Literal(
15
15
  'member:remove',
16
16
  'role:view',
17
17
  'role:manage',
18
+ 'training-type:create',
19
+ 'training-type:delete',
18
20
  );
19
21
  export type Permission = typeof Permission.Type;
20
22
 
@@ -32,6 +34,8 @@ export const defaultPermissions: Record<string, ReadonlyArray<Permission>> = {
32
34
  'member:remove',
33
35
  'role:view',
34
36
  'role:manage',
37
+ 'training-type:create',
38
+ 'training-type:delete',
35
39
  ],
36
40
  Captain: ['roster:view', 'roster:manage', 'member:view', 'member:edit', 'role:view'],
37
41
  Player: ['roster:view', 'member:view'],
@@ -0,0 +1,8 @@
1
+ import { Schema } from 'effect';
2
+ import { GroupId } from '~/models/GroupModel.js';
3
+ import { RoleId } from '~/models/Role.js';
4
+
5
+ export class RoleGroup extends Schema.Class<RoleGroup>('RoleGroup')({
6
+ role_id: RoleId,
7
+ group_id: GroupId,
8
+ }) {}
@@ -1,5 +1,6 @@
1
1
  import { Model } from '@effect/sql';
2
2
  import { Schema } from 'effect';
3
+ import { Snowflake } from '~/models/Discord.js';
3
4
  import { UserId } from '~/models/User.js';
4
5
 
5
6
  export const TeamId = Schema.String.pipe(Schema.brand('TeamId'));
@@ -8,6 +9,7 @@ export type TeamId = typeof TeamId.Type;
8
9
  export class Team extends Model.Class<Team>('Team')({
9
10
  id: Model.Generated(TeamId),
10
11
  name: Schema.String,
12
+ guild_id: Snowflake,
11
13
  created_by: UserId,
12
14
  created_at: Model.DateTimeInsertFromDate,
13
15
  updated_at: Model.DateTimeUpdateFromDate,
@@ -1,5 +1,6 @@
1
1
  import { Model } from '@effect/sql';
2
2
  import { Schema } from 'effect';
3
+ import { GroupId } from '~/models/GroupModel.js';
3
4
  import { TeamId } from '~/models/Team.js';
4
5
 
5
6
  export const TrainingTypeId = Schema.String.pipe(Schema.brand('TrainingTypeId'));
@@ -9,5 +10,6 @@ export class TrainingType extends Model.Class<TrainingType>('TrainingType')({
9
10
  id: Model.Generated(TrainingTypeId),
10
11
  team_id: TeamId,
11
12
  name: Schema.String,
13
+ group_id: Schema.NullOr(GroupId),
12
14
  created_at: Model.DateTimeInsertFromDate,
13
15
  }) {}
@@ -1,5 +1,6 @@
1
1
  import { RpcGroup } from '@effect/rpc';
2
2
  import { ChannelRpcGroup } from './channel/ChannelRpcGroup.js';
3
+ import { GuildRpcGroup } from './guild/GuildRpcGroup.js';
3
4
  import { RoleRpcGroup } from './role/RoleRpcGroup.js';
4
5
 
5
- export class SyncRpcs extends RpcGroup.make().merge(RoleRpcGroup, ChannelRpcGroup) {}
6
+ export class SyncRpcs extends RpcGroup.make().merge(RoleRpcGroup, ChannelRpcGroup, GuildRpcGroup) {}
@@ -1,5 +1,5 @@
1
1
  import { Schema } from 'effect';
2
- import { ChannelSyncEvent, Discord, SubgroupModel, Team, TeamMember } from '~/index.js';
2
+ import { ChannelSyncEvent, Discord, GroupModel, Team, TeamMember } from '~/index.js';
3
3
 
4
4
  export class ChannelCreatedEvent extends Schema.TaggedClass<ChannelCreatedEvent>()(
5
5
  'channel_created',
@@ -7,8 +7,8 @@ export class ChannelCreatedEvent extends Schema.TaggedClass<ChannelCreatedEvent>
7
7
  id: ChannelSyncEvent.ChannelSyncEventId,
8
8
  team_id: Team.TeamId,
9
9
  guild_id: Discord.Snowflake,
10
- subgroup_id: SubgroupModel.SubgroupId,
11
- subgroup_name: Schema.String,
10
+ group_id: GroupModel.GroupId,
11
+ group_name: Schema.String,
12
12
  },
13
13
  ) {}
14
14
 
@@ -18,7 +18,7 @@ export class ChannelDeletedEvent extends Schema.TaggedClass<ChannelDeletedEvent>
18
18
  id: ChannelSyncEvent.ChannelSyncEventId,
19
19
  team_id: Team.TeamId,
20
20
  guild_id: Discord.Snowflake,
21
- subgroup_id: SubgroupModel.SubgroupId,
21
+ group_id: GroupModel.GroupId,
22
22
  },
23
23
  ) {}
24
24
 
@@ -28,8 +28,8 @@ export class ChannelMemberAddedEvent extends Schema.TaggedClass<ChannelMemberAdd
28
28
  id: ChannelSyncEvent.ChannelSyncEventId,
29
29
  team_id: Team.TeamId,
30
30
  guild_id: Discord.Snowflake,
31
- subgroup_id: SubgroupModel.SubgroupId,
32
- subgroup_name: Schema.String,
31
+ group_id: GroupModel.GroupId,
32
+ group_name: Schema.String,
33
33
  team_member_id: TeamMember.TeamMemberId,
34
34
  discord_user_id: Discord.Snowflake,
35
35
  },
@@ -41,7 +41,7 @@ export class ChannelMemberRemovedEvent extends Schema.TaggedClass<ChannelMemberR
41
41
  id: ChannelSyncEvent.ChannelSyncEventId,
42
42
  team_id: Team.TeamId,
43
43
  guild_id: Discord.Snowflake,
44
- subgroup_id: SubgroupModel.SubgroupId,
44
+ group_id: GroupModel.GroupId,
45
45
  team_member_id: TeamMember.TeamMemberId,
46
46
  discord_user_id: Discord.Snowflake,
47
47
  },
@@ -1,6 +1,6 @@
1
1
  import { Rpc, RpcGroup } from '@effect/rpc';
2
2
  import { Schema } from 'effect';
3
- import { ChannelSyncEvent, Discord, SubgroupModel, Team } from '~/index.js';
3
+ import { ChannelSyncEvent, Discord, GroupModel, Team } from '~/index.js';
4
4
  import { UnprocessedChannelEvent } from './ChannelRpcEvents.js';
5
5
  import { ChannelMapping } from './ChannelRpcModels.js';
6
6
 
@@ -16,18 +16,18 @@ export const ChannelRpcGroup = RpcGroup.make(
16
16
  payload: { id: ChannelSyncEvent.ChannelSyncEventId, error: Schema.String },
17
17
  }),
18
18
  Rpc.make('GetMapping', {
19
- payload: { team_id: Team.TeamId, subgroup_id: SubgroupModel.SubgroupId },
19
+ payload: { team_id: Team.TeamId, group_id: GroupModel.GroupId },
20
20
  success: Schema.OptionFromNullOr(ChannelMapping),
21
21
  }),
22
22
  Rpc.make('UpsertMapping', {
23
23
  payload: {
24
24
  team_id: Team.TeamId,
25
- subgroup_id: SubgroupModel.SubgroupId,
25
+ group_id: GroupModel.GroupId,
26
26
  discord_channel_id: Discord.Snowflake,
27
27
  discord_role_id: Discord.Snowflake,
28
28
  },
29
29
  }),
30
30
  Rpc.make('DeleteMapping', {
31
- payload: { team_id: Team.TeamId, subgroup_id: SubgroupModel.SubgroupId },
31
+ payload: { team_id: Team.TeamId, group_id: GroupModel.GroupId },
32
32
  }),
33
33
  ).prefix('Channel/');
@@ -1,10 +1,10 @@
1
1
  import { Schema } from 'effect';
2
- import { Discord, DiscordChannelMapping, SubgroupModel, Team } from '~/index.js';
2
+ import { Discord, DiscordChannelMapping, GroupModel, Team } from '~/index.js';
3
3
 
4
4
  export class ChannelMapping extends Schema.Class<ChannelMapping>('ChannelMapping')({
5
5
  id: DiscordChannelMapping.DiscordChannelMappingId,
6
6
  team_id: Team.TeamId,
7
- subgroup_id: SubgroupModel.SubgroupId,
7
+ group_id: GroupModel.GroupId,
8
8
  discord_channel_id: Discord.Snowflake,
9
9
  discord_role_id: Schema.OptionFromNullOr(Discord.Snowflake),
10
10
  }) {}