@sideline/domain 0.4.0 → 0.6.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 (254) 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 +31 -7
  4. package/dist/cjs/api/Auth.js.map +1 -1
  5. package/dist/cjs/api/EventApi.js +141 -0
  6. package/dist/cjs/api/EventApi.js.map +1 -0
  7. package/dist/cjs/api/EventRsvpApi.js +66 -0
  8. package/dist/cjs/api/EventRsvpApi.js.map +1 -0
  9. package/dist/cjs/api/EventSeriesApi.js +139 -0
  10. package/dist/cjs/api/EventSeriesApi.js.map +1 -0
  11. package/dist/cjs/api/GroupApi.js +205 -0
  12. package/dist/cjs/api/GroupApi.js.map +1 -0
  13. package/dist/cjs/api/NotificationApi.js +6 -2
  14. package/dist/cjs/api/NotificationApi.js.map +1 -1
  15. package/dist/cjs/api/Roster.js +3 -2
  16. package/dist/cjs/api/Roster.js.map +1 -1
  17. package/dist/cjs/api/TeamSettingsApi.js +55 -0
  18. package/dist/cjs/api/TeamSettingsApi.js.map +1 -0
  19. package/dist/cjs/api/TrainingTypeApi.js +15 -41
  20. package/dist/cjs/api/TrainingTypeApi.js.map +1 -1
  21. package/dist/cjs/index.js +31 -5
  22. package/dist/cjs/models/AgeThresholdRule.js +2 -2
  23. package/dist/cjs/models/AgeThresholdRule.js.map +1 -1
  24. package/dist/cjs/models/ChannelSyncEvent.js +3 -3
  25. package/dist/cjs/models/ChannelSyncEvent.js.map +1 -1
  26. package/dist/cjs/models/DiscordChannelMapping.js +2 -2
  27. package/dist/cjs/models/DiscordChannelMapping.js.map +1 -1
  28. package/dist/cjs/models/Event.js +36 -0
  29. package/dist/cjs/models/Event.js.map +1 -0
  30. package/dist/cjs/models/EventRsvp.js +23 -0
  31. package/dist/cjs/models/EventRsvp.js.map +1 -0
  32. package/dist/cjs/models/EventSeries.js +35 -0
  33. package/dist/cjs/models/EventSeries.js.map +1 -0
  34. package/dist/cjs/models/GroupModel.js +20 -0
  35. package/dist/cjs/models/GroupModel.js.map +1 -0
  36. package/dist/cjs/models/Notification.js +1 -1
  37. package/dist/cjs/models/Notification.js.map +1 -1
  38. package/dist/cjs/models/Role.js +3 -3
  39. package/dist/cjs/models/Role.js.map +1 -1
  40. package/dist/cjs/models/RoleGroup.js +15 -0
  41. package/dist/cjs/models/RoleGroup.js.map +1 -0
  42. package/dist/cjs/models/Session.js +3 -5
  43. package/dist/cjs/models/Session.js.map +1 -1
  44. package/dist/cjs/models/Team.js +2 -0
  45. package/dist/cjs/models/Team.js.map +1 -1
  46. package/dist/cjs/models/TeamInvite.js +3 -5
  47. package/dist/cjs/models/TeamInvite.js.map +1 -1
  48. package/dist/cjs/models/TeamSettings.js +17 -0
  49. package/dist/cjs/models/TeamSettings.js.map +1 -0
  50. package/dist/cjs/models/TrainingType.js +2 -0
  51. package/dist/cjs/models/TrainingType.js.map +1 -1
  52. package/dist/cjs/models/User.js +3 -1
  53. package/dist/cjs/models/User.js.map +1 -1
  54. package/dist/cjs/rpc/SyncRpcs.js +3 -1
  55. package/dist/cjs/rpc/SyncRpcs.js.map +1 -1
  56. package/dist/cjs/rpc/channel/ChannelRpcEvents.js +6 -6
  57. package/dist/cjs/rpc/channel/ChannelRpcEvents.js.map +1 -1
  58. package/dist/cjs/rpc/channel/ChannelRpcGroup.js +3 -3
  59. package/dist/cjs/rpc/channel/ChannelRpcGroup.js.map +1 -1
  60. package/dist/cjs/rpc/channel/ChannelRpcModels.js +1 -1
  61. package/dist/cjs/rpc/channel/ChannelRpcModels.js.map +1 -1
  62. package/dist/cjs/rpc/event/EventRpcEvents.js +45 -0
  63. package/dist/cjs/rpc/event/EventRpcEvents.js.map +1 -0
  64. package/dist/cjs/rpc/event/EventRpcGroup.js +65 -0
  65. package/dist/cjs/rpc/event/EventRpcGroup.js.map +1 -0
  66. package/dist/cjs/rpc/event/EventRpcModels.js +47 -0
  67. package/dist/cjs/rpc/event/EventRpcModels.js.map +1 -0
  68. package/dist/cjs/rpc/guild/GuildRpcGroup.js +35 -0
  69. package/dist/cjs/rpc/guild/GuildRpcGroup.js.map +1 -0
  70. package/dist/dts/api/AgeThresholdApi.d.ts +25 -25
  71. package/dist/dts/api/AgeThresholdApi.d.ts.map +1 -1
  72. package/dist/dts/api/Auth.d.ts +42 -13
  73. package/dist/dts/api/Auth.d.ts.map +1 -1
  74. package/dist/dts/api/EventApi.d.ts +273 -0
  75. package/dist/dts/api/EventApi.d.ts.map +1 -0
  76. package/dist/dts/api/EventRsvpApi.d.ts +96 -0
  77. package/dist/dts/api/EventRsvpApi.d.ts.map +1 -0
  78. package/dist/dts/api/EventSeriesApi.d.ts +284 -0
  79. package/dist/dts/api/EventSeriesApi.d.ts.map +1 -0
  80. package/dist/dts/api/GroupApi.d.ts +254 -0
  81. package/dist/dts/api/GroupApi.d.ts.map +1 -0
  82. package/dist/dts/api/NotificationApi.d.ts +10 -6
  83. package/dist/dts/api/NotificationApi.d.ts.map +1 -1
  84. package/dist/dts/api/RoleApi.d.ts +10 -10
  85. package/dist/dts/api/Roster.d.ts +15 -11
  86. package/dist/dts/api/Roster.d.ts.map +1 -1
  87. package/dist/dts/api/TeamSettingsApi.d.ts +107 -0
  88. package/dist/dts/api/TeamSettingsApi.d.ts.map +1 -0
  89. package/dist/dts/api/TrainingTypeApi.d.ts +33 -42
  90. package/dist/dts/api/TrainingTypeApi.d.ts.map +1 -1
  91. package/dist/dts/index.d.ts +15 -2
  92. package/dist/dts/index.d.ts.map +1 -1
  93. package/dist/dts/models/AgeThresholdRule.d.ts +13 -13
  94. package/dist/dts/models/ChannelSyncEvent.d.ts +32 -32
  95. package/dist/dts/models/DiscordChannelMapping.d.ts +11 -11
  96. package/dist/dts/models/Event.d.ts +233 -0
  97. package/dist/dts/models/Event.d.ts.map +1 -0
  98. package/dist/dts/models/EventRsvp.d.ts +110 -0
  99. package/dist/dts/models/EventRsvp.d.ts.map +1 -0
  100. package/dist/dts/models/EventSeries.d.ts +248 -0
  101. package/dist/dts/models/EventSeries.d.ts.map +1 -0
  102. package/dist/dts/models/GroupModel.d.ts +97 -0
  103. package/dist/dts/models/GroupModel.d.ts.map +1 -0
  104. package/dist/dts/models/Notification.d.ts +14 -14
  105. package/dist/dts/models/Notification.d.ts.map +1 -1
  106. package/dist/dts/models/Role.d.ts +4 -4
  107. package/dist/dts/models/Role.d.ts.map +1 -1
  108. package/dist/dts/models/RoleGroup.d.ts +16 -0
  109. package/dist/dts/models/RoleGroup.d.ts.map +1 -0
  110. package/dist/dts/models/RoleSyncEvent.d.ts +8 -8
  111. package/dist/dts/models/Session.d.ts +6 -6
  112. package/dist/dts/models/Session.d.ts.map +1 -1
  113. package/dist/dts/models/Team.d.ts +13 -0
  114. package/dist/dts/models/Team.d.ts.map +1 -1
  115. package/dist/dts/models/TeamInvite.d.ts +6 -6
  116. package/dist/dts/models/TeamInvite.d.ts.map +1 -1
  117. package/dist/dts/models/{SubgroupModel.d.ts → TeamSettings.d.ts} +27 -28
  118. package/dist/dts/models/TeamSettings.d.ts.map +1 -0
  119. package/dist/dts/models/TrainingType.d.ts +13 -0
  120. package/dist/dts/models/TrainingType.d.ts.map +1 -1
  121. package/dist/dts/models/User.d.ts +11 -11
  122. package/dist/dts/models/User.d.ts.map +1 -1
  123. package/dist/dts/rpc/SyncRpcs.d.ts +45 -3
  124. package/dist/dts/rpc/SyncRpcs.d.ts.map +1 -1
  125. package/dist/dts/rpc/channel/ChannelRpcEvents.d.ts +6 -6
  126. package/dist/dts/rpc/channel/ChannelRpcGroup.d.ts +3 -3
  127. package/dist/dts/rpc/channel/ChannelRpcModels.d.ts +3 -3
  128. package/dist/dts/rpc/event/EventRpcEvents.d.ts +49 -0
  129. package/dist/dts/rpc/event/EventRpcEvents.d.ts.map +1 -0
  130. package/dist/dts/rpc/event/EventRpcGroup.d.ts +32 -0
  131. package/dist/dts/rpc/event/EventRpcGroup.d.ts.map +1 -0
  132. package/dist/dts/rpc/event/EventRpcModels.d.ts +115 -0
  133. package/dist/dts/rpc/event/EventRpcModels.d.ts.map +1 -0
  134. package/dist/dts/rpc/guild/GuildRpcGroup.d.ts +19 -0
  135. package/dist/dts/rpc/guild/GuildRpcGroup.d.ts.map +1 -0
  136. package/dist/esm/api/AgeThresholdApi.js +11 -11
  137. package/dist/esm/api/AgeThresholdApi.js.map +1 -1
  138. package/dist/esm/api/Auth.js +29 -6
  139. package/dist/esm/api/Auth.js.map +1 -1
  140. package/dist/esm/api/EventApi.js +126 -0
  141. package/dist/esm/api/EventApi.js.map +1 -0
  142. package/dist/esm/api/EventRsvpApi.js +53 -0
  143. package/dist/esm/api/EventRsvpApi.js.map +1 -0
  144. package/dist/esm/api/EventSeriesApi.js +126 -0
  145. package/dist/esm/api/EventSeriesApi.js.map +1 -0
  146. package/dist/esm/api/GroupApi.js +185 -0
  147. package/dist/esm/api/GroupApi.js.map +1 -0
  148. package/dist/esm/api/NotificationApi.js +6 -2
  149. package/dist/esm/api/NotificationApi.js.map +1 -1
  150. package/dist/esm/api/Roster.js +3 -2
  151. package/dist/esm/api/Roster.js.map +1 -1
  152. package/dist/esm/api/TeamSettingsApi.js +46 -0
  153. package/dist/esm/api/TeamSettingsApi.js.map +1 -0
  154. package/dist/esm/api/TrainingTypeApi.js +14 -38
  155. package/dist/esm/api/TrainingTypeApi.js.map +1 -1
  156. package/dist/esm/index.js +15 -2
  157. package/dist/esm/index.js.map +1 -1
  158. package/dist/esm/models/AgeThresholdRule.js +2 -2
  159. package/dist/esm/models/AgeThresholdRule.js.map +1 -1
  160. package/dist/esm/models/ChannelSyncEvent.js +3 -3
  161. package/dist/esm/models/ChannelSyncEvent.js.map +1 -1
  162. package/dist/esm/models/DiscordChannelMapping.js +2 -2
  163. package/dist/esm/models/DiscordChannelMapping.js.map +1 -1
  164. package/dist/esm/models/Event.js +28 -0
  165. package/dist/esm/models/Event.js.map +1 -0
  166. package/dist/esm/models/EventRsvp.js +16 -0
  167. package/dist/esm/models/EventRsvp.js.map +1 -0
  168. package/dist/esm/models/EventSeries.js +28 -0
  169. package/dist/esm/models/EventSeries.js.map +1 -0
  170. package/dist/esm/models/GroupModel.js +13 -0
  171. package/dist/esm/models/GroupModel.js.map +1 -0
  172. package/dist/esm/models/Notification.js +1 -1
  173. package/dist/esm/models/Notification.js.map +1 -1
  174. package/dist/esm/models/Role.js +3 -3
  175. package/dist/esm/models/Role.js.map +1 -1
  176. package/dist/esm/models/RoleGroup.js +8 -0
  177. package/dist/esm/models/RoleGroup.js.map +1 -0
  178. package/dist/esm/models/Session.js +3 -6
  179. package/dist/esm/models/Session.js.map +1 -1
  180. package/dist/esm/models/Team.js +2 -0
  181. package/dist/esm/models/Team.js.map +1 -1
  182. package/dist/esm/models/TeamInvite.js +3 -6
  183. package/dist/esm/models/TeamInvite.js.map +1 -1
  184. package/dist/esm/models/TeamSettings.js +10 -0
  185. package/dist/esm/models/TeamSettings.js.map +1 -0
  186. package/dist/esm/models/TrainingType.js +2 -0
  187. package/dist/esm/models/TrainingType.js.map +1 -1
  188. package/dist/esm/models/User.js +2 -1
  189. package/dist/esm/models/User.js.map +1 -1
  190. package/dist/esm/rpc/SyncRpcs.js +3 -1
  191. package/dist/esm/rpc/SyncRpcs.js.map +1 -1
  192. package/dist/esm/rpc/channel/ChannelRpcEvents.js +7 -7
  193. package/dist/esm/rpc/channel/ChannelRpcEvents.js.map +1 -1
  194. package/dist/esm/rpc/channel/ChannelRpcGroup.js +4 -4
  195. package/dist/esm/rpc/channel/ChannelRpcGroup.js.map +1 -1
  196. package/dist/esm/rpc/channel/ChannelRpcModels.js +2 -2
  197. package/dist/esm/rpc/channel/ChannelRpcModels.js.map +1 -1
  198. package/dist/esm/rpc/event/EventRpcEvents.js +36 -0
  199. package/dist/esm/rpc/event/EventRpcEvents.js.map +1 -0
  200. package/dist/esm/rpc/event/EventRpcGroup.js +59 -0
  201. package/dist/esm/rpc/event/EventRpcGroup.js.map +1 -0
  202. package/dist/esm/rpc/event/EventRpcModels.js +33 -0
  203. package/dist/esm/rpc/event/EventRpcModels.js.map +1 -0
  204. package/dist/esm/rpc/guild/GuildRpcGroup.js +29 -0
  205. package/dist/esm/rpc/guild/GuildRpcGroup.js.map +1 -0
  206. package/package.json +3 -2
  207. package/src/api/AgeThresholdApi.ts +12 -12
  208. package/src/api/Auth.ts +36 -12
  209. package/src/api/EventApi.ts +129 -0
  210. package/src/api/EventRsvpApi.ts +67 -0
  211. package/src/api/EventSeriesApi.ts +134 -0
  212. package/src/api/GroupApi.ts +229 -0
  213. package/src/api/NotificationApi.ts +10 -0
  214. package/src/api/Roster.ts +3 -2
  215. package/src/api/TeamSettingsApi.ts +57 -0
  216. package/src/api/TrainingTypeApi.ts +8 -52
  217. package/src/index.ts +25 -3
  218. package/src/models/AgeThresholdRule.ts +2 -2
  219. package/src/models/ChannelSyncEvent.ts +3 -3
  220. package/src/models/DiscordChannelMapping.ts +2 -2
  221. package/src/models/Event.ts +41 -0
  222. package/src/models/EventRsvp.ts +20 -0
  223. package/src/models/EventSeries.ts +36 -0
  224. package/src/models/GroupModel.ts +15 -0
  225. package/src/models/Notification.ts +2 -2
  226. package/src/models/Role.ts +20 -1
  227. package/src/models/RoleGroup.ts +8 -0
  228. package/src/models/Session.ts +3 -7
  229. package/src/models/Team.ts +2 -0
  230. package/src/models/TeamInvite.ts +3 -9
  231. package/src/models/TeamSettings.ts +10 -0
  232. package/src/models/TrainingType.ts +2 -0
  233. package/src/models/User.ts +2 -1
  234. package/src/rpc/SyncRpcs.ts +8 -1
  235. package/src/rpc/channel/ChannelRpcEvents.ts +7 -7
  236. package/src/rpc/channel/ChannelRpcGroup.ts +4 -4
  237. package/src/rpc/channel/ChannelRpcModels.ts +2 -2
  238. package/src/rpc/event/EventRpcEvents.ts +48 -0
  239. package/src/rpc/event/EventRpcGroup.ts +60 -0
  240. package/src/rpc/event/EventRpcModels.ts +49 -0
  241. package/src/rpc/guild/GuildRpcGroup.ts +29 -0
  242. package/dist/cjs/api/SubgroupApi.js +0 -122
  243. package/dist/cjs/api/SubgroupApi.js.map +0 -1
  244. package/dist/cjs/models/SubgroupModel.js +0 -18
  245. package/dist/cjs/models/SubgroupModel.js.map +0 -1
  246. package/dist/dts/api/SubgroupApi.d.ts +0 -140
  247. package/dist/dts/api/SubgroupApi.d.ts.map +0 -1
  248. package/dist/dts/models/SubgroupModel.d.ts.map +0 -1
  249. package/dist/esm/api/SubgroupApi.js +0 -106
  250. package/dist/esm/api/SubgroupApi.js.map +0 -1
  251. package/dist/esm/models/SubgroupModel.js +0 -11
  252. package/dist/esm/models/SubgroupModel.js.map +0 -1
  253. package/src/api/SubgroupApi.ts +0 -146
  254. 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
  ) {}
package/src/api/Roster.ts CHANGED
@@ -10,10 +10,11 @@ import { Gender, UserId } from '~/models/User.js';
10
10
  export class RosterPlayer extends Schema.Class<RosterPlayer>('RosterPlayer')({
11
11
  memberId: TeamMemberId,
12
12
  userId: UserId,
13
+ discordId: Schema.String,
13
14
  roleNames: Schema.Array(Schema.String),
14
15
  permissions: Schema.Array(Permission),
15
16
  name: Schema.NullOr(Schema.String),
16
- birthYear: Schema.NullOr(Schema.Number),
17
+ birthDate: Schema.NullOr(Schema.String),
17
18
  gender: Schema.NullOr(Gender),
18
19
  jerseyNumber: Schema.NullOr(Schema.Number),
19
20
  discordUsername: Schema.String,
@@ -22,7 +23,7 @@ export class RosterPlayer extends Schema.Class<RosterPlayer>('RosterPlayer')({
22
23
 
23
24
  export class UpdatePlayerRequest extends Schema.Class<UpdatePlayerRequest>('UpdatePlayerRequest')({
24
25
  name: Schema.NullOr(Schema.String),
25
- birthYear: Schema.NullOr(Schema.Number),
26
+ birthDate: Schema.OptionFromNullOr(Schema.String),
26
27
  gender: Schema.NullOr(Gender),
27
28
  jerseyNumber: Schema.NullOr(Schema.Number),
28
29
  }) {}
@@ -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
+ ) {}
@@ -1,29 +1,25 @@
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),
21
+ discordChannelId: Schema.NullOr(Schema.String),
19
22
  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
23
  }) {}
28
24
 
29
25
  export class TrainingTypeListResponse extends Schema.Class<TrainingTypeListResponse>(
@@ -37,18 +33,15 @@ export class CreateTrainingTypeRequest extends Schema.Class<CreateTrainingTypeRe
37
33
  'CreateTrainingTypeRequest',
38
34
  )({
39
35
  name: Schema.NonEmptyString,
36
+ groupId: Schema.NullOr(GroupId),
37
+ discordChannelId: Schema.NullOr(Schema.String),
40
38
  }) {}
41
39
 
42
40
  export class UpdateTrainingTypeRequest extends Schema.Class<UpdateTrainingTypeRequest>(
43
41
  'UpdateTrainingTypeRequest',
44
42
  )({
45
43
  name: Schema.NonEmptyString,
46
- }) {}
47
-
48
- export class AddTrainingTypeCoachRequest extends Schema.Class<AddTrainingTypeCoachRequest>(
49
- 'AddTrainingTypeCoachRequest',
50
- )({
51
- memberId: TeamMemberId,
44
+ discordChannelId: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), { as: 'Option' }),
52
45
  }) {}
53
46
 
54
47
  export class TrainingTypeNotFound extends Schema.TaggedError<TrainingTypeNotFound>()(
@@ -63,12 +56,6 @@ export class Forbidden extends Schema.TaggedError<Forbidden>()(
63
56
  HttpApiSchema.annotations({ status: 403 }),
64
57
  ) {}
65
58
 
66
- export class MemberNotFound extends Schema.TaggedError<MemberNotFound>()(
67
- 'TrainingTypeMemberNotFound',
68
- {},
69
- HttpApiSchema.annotations({ status: 404 }),
70
- ) {}
71
-
72
59
  export class TrainingTypeApiGroup extends HttpApiGroup.make('trainingType')
73
60
  .add(
74
61
  HttpApiEndpoint.get('listTrainingTypes', '/teams/:teamId/training-types')
@@ -109,35 +96,4 @@ export class TrainingTypeApiGroup extends HttpApiGroup.make('trainingType')
109
96
  .addError(TrainingTypeNotFound, { status: 404 })
110
97
  .setPath(Schema.Struct({ teamId: TeamId, trainingTypeId: TrainingTypeId }))
111
98
  .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
99
  ) {}
package/src/index.ts CHANGED
@@ -4,6 +4,14 @@ 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
+
13
+ export * as GroupApi from './api/GroupApi.js';
14
+
7
15
  export * as Invite from './api/Invite.js';
8
16
 
9
17
  export * as NotificationApi from './api/NotificationApi.js';
@@ -12,7 +20,7 @@ export * as RoleApi from './api/RoleApi.js';
12
20
 
13
21
  export * as Roster from './api/Roster.js';
14
22
 
15
- export * as SubgroupApi from './api/SubgroupApi.js';
23
+ export * as TeamSettingsApi from './api/TeamSettingsApi.js';
16
24
 
17
25
  export * as TrainingTypeApi from './api/TrainingTypeApi.js';
18
26
 
@@ -26,12 +34,22 @@ 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
+
43
+ export * as GroupModel from './models/GroupModel.js';
44
+
29
45
  export * as MemberRole from './models/MemberRole.js';
30
46
 
31
47
  export * as Notification from './models/Notification.js';
32
48
 
33
49
  export * as Role from './models/Role.js';
34
50
 
51
+ export * as RoleGroup from './models/RoleGroup.js';
52
+
35
53
  export * as RoleSyncEvent from './models/RoleSyncEvent.js';
36
54
 
37
55
  export * as RosterMemberModel from './models/RosterMemberModel.js';
@@ -40,20 +58,24 @@ export * as RosterModel from './models/RosterModel.js';
40
58
 
41
59
  export * as Session from './models/Session.js';
42
60
 
43
- export * as SubgroupModel from './models/SubgroupModel.js';
44
-
45
61
  export * as Team from './models/Team.js';
46
62
 
47
63
  export * as TeamInvite from './models/TeamInvite.js';
48
64
 
49
65
  export * as TeamMember from './models/TeamMember.js';
50
66
 
67
+ export * as TeamSettings from './models/TeamSettings.js';
68
+
51
69
  export * as TrainingType from './models/TrainingType.js';
52
70
 
53
71
  export * as User from './models/User.js';
54
72
  export * as ChannelRpcEvents from './rpc/channel/ChannelRpcEvents.js';
55
73
  export * as ChannelRpcGroup from './rpc/channel/ChannelRpcGroup.js';
56
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';
78
+ export * as GuildRpcGroup from './rpc/guild/GuildRpcGroup.js';
57
79
  export * as RoleRpcEvents from './rpc/role/RoleRpcEvents.js';
58
80
  export * as RoleRpcGroup from './rpc/role/RoleRpcGroup.js';
59
81
  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,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
+ }) {}
@@ -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
+ }) {}