@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,59 @@
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 { EventDiscordMessage, EventEmbedInfo, RsvpAttendeesResult, RsvpCountsResult, RsvpDeadlinePassed, RsvpEventNotFound, RsvpMemberNotFound } from './EventRpcModels.js';
6
+ export const EventRpcGroup = /*#__PURE__*/RpcGroup.make(Rpc.make('GetUnprocessedEvents', {
7
+ payload: {
8
+ limit: Schema.Number
9
+ },
10
+ success: Schema.Array(UnprocessedEventSyncEvent)
11
+ }), Rpc.make('MarkEventProcessed', {
12
+ payload: {
13
+ id: Schema.String
14
+ }
15
+ }), Rpc.make('MarkEventFailed', {
16
+ payload: {
17
+ id: Schema.String,
18
+ error: Schema.String
19
+ }
20
+ }), Rpc.make('SaveDiscordMessageId', {
21
+ payload: {
22
+ event_id: Event.EventId,
23
+ discord_channel_id: Schema.String,
24
+ discord_message_id: Schema.String
25
+ }
26
+ }), Rpc.make('GetDiscordMessageId', {
27
+ payload: {
28
+ event_id: Event.EventId
29
+ },
30
+ success: Schema.OptionFromNullOr(EventDiscordMessage)
31
+ }), Rpc.make('SubmitRsvp', {
32
+ payload: {
33
+ event_id: Event.EventId,
34
+ team_id: Team.TeamId,
35
+ discord_user_id: Discord.Snowflake,
36
+ response: EventRsvp.RsvpResponse,
37
+ message: Schema.NullOr(Schema.String)
38
+ },
39
+ success: RsvpCountsResult,
40
+ error: Schema.Union(RsvpMemberNotFound, RsvpDeadlinePassed, RsvpEventNotFound)
41
+ }), Rpc.make('GetRsvpCounts', {
42
+ payload: {
43
+ event_id: Event.EventId
44
+ },
45
+ success: RsvpCountsResult
46
+ }), Rpc.make('GetEventEmbedInfo', {
47
+ payload: {
48
+ event_id: Event.EventId
49
+ },
50
+ success: Schema.OptionFromNullOr(EventEmbedInfo)
51
+ }), Rpc.make('GetRsvpAttendees', {
52
+ payload: {
53
+ event_id: Event.EventId,
54
+ offset: Schema.Number,
55
+ limit: Schema.Number
56
+ },
57
+ success: RsvpAttendeesResult
58
+ })).prefix('Event/');
59
+ //# sourceMappingURL=EventRpcGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventRpcGroup.js","names":["Rpc","RpcGroup","Schema","Discord","Event","EventRsvp","Team","UnprocessedEventSyncEvent","EventDiscordMessage","EventEmbedInfo","RsvpAttendeesResult","RsvpCountsResult","RsvpDeadlinePassed","RsvpEventNotFound","RsvpMemberNotFound","EventRpcGroup","make","payload","limit","Number","success","Array","id","String","error","event_id","EventId","discord_channel_id","discord_message_id","OptionFromNullOr","team_id","TeamId","discord_user_id","Snowflake","response","RsvpResponse","message","NullOr","Union","offset","prefix"],"sources":["../../../../src/rpc/event/EventRpcGroup.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,GAAG,EAAEC,QAAQ,QAAQ,aAAa;AAC3C,SAASC,MAAM,QAAQ,QAAQ;AAC/B,SAASC,OAAO,EAAEC,KAAK,EAAEC,SAAS,EAAEC,IAAI,QAAQ,gBAAa;AAC7D,SAASC,yBAAyB,QAAQ,qBAAqB;AAC/D,SACEC,mBAAmB,EACnBC,cAAc,EACdC,mBAAmB,EACnBC,gBAAgB,EAChBC,kBAAkB,EAClBC,iBAAiB,EACjBC,kBAAkB,QACb,qBAAqB;AAE5B,OAAO,MAAMC,aAAa,gBAAGd,QAAQ,CAACe,IAAI,CACxChB,GAAG,CAACgB,IAAI,CAAC,sBAAsB,EAAE;EAC/BC,OAAO,EAAE;IAAEC,KAAK,EAAEhB,MAAM,CAACiB;EAAM,CAAE;EACjCC,OAAO,EAAElB,MAAM,CAACmB,KAAK,CAACd,yBAAyB;CAChD,CAAC,EACFP,GAAG,CAACgB,IAAI,CAAC,oBAAoB,EAAE;EAC7BC,OAAO,EAAE;IAAEK,EAAE,EAAEpB,MAAM,CAACqB;EAAM;CAC7B,CAAC,EACFvB,GAAG,CAACgB,IAAI,CAAC,iBAAiB,EAAE;EAC1BC,OAAO,EAAE;IAAEK,EAAE,EAAEpB,MAAM,CAACqB,MAAM;IAAEC,KAAK,EAAEtB,MAAM,CAACqB;EAAM;CACnD,CAAC,EACFvB,GAAG,CAACgB,IAAI,CAAC,sBAAsB,EAAE;EAC/BC,OAAO,EAAE;IACPQ,QAAQ,EAAErB,KAAK,CAACsB,OAAO;IACvBC,kBAAkB,EAAEzB,MAAM,CAACqB,MAAM;IACjCK,kBAAkB,EAAE1B,MAAM,CAACqB;;CAE9B,CAAC,EACFvB,GAAG,CAACgB,IAAI,CAAC,qBAAqB,EAAE;EAC9BC,OAAO,EAAE;IAAEQ,QAAQ,EAAErB,KAAK,CAACsB;EAAO,CAAE;EACpCN,OAAO,EAAElB,MAAM,CAAC2B,gBAAgB,CAACrB,mBAAmB;CACrD,CAAC,EACFR,GAAG,CAACgB,IAAI,CAAC,YAAY,EAAE;EACrBC,OAAO,EAAE;IACPQ,QAAQ,EAAErB,KAAK,CAACsB,OAAO;IACvBI,OAAO,EAAExB,IAAI,CAACyB,MAAM;IACpBC,eAAe,EAAE7B,OAAO,CAAC8B,SAAS;IAClCC,QAAQ,EAAE7B,SAAS,CAAC8B,YAAY;IAChCC,OAAO,EAAElC,MAAM,CAACmC,MAAM,CAACnC,MAAM,CAACqB,MAAM;GACrC;EACDH,OAAO,EAAET,gBAAgB;EACzBa,KAAK,EAAEtB,MAAM,CAACoC,KAAK,CAACxB,kBAAkB,EAAEF,kBAAkB,EAAEC,iBAAiB;CAC9E,CAAC,EACFb,GAAG,CAACgB,IAAI,CAAC,eAAe,EAAE;EACxBC,OAAO,EAAE;IAAEQ,QAAQ,EAAErB,KAAK,CAACsB;EAAO,CAAE;EACpCN,OAAO,EAAET;CACV,CAAC,EACFX,GAAG,CAACgB,IAAI,CAAC,mBAAmB,EAAE;EAC5BC,OAAO,EAAE;IAAEQ,QAAQ,EAAErB,KAAK,CAACsB;EAAO,CAAE;EACpCN,OAAO,EAAElB,MAAM,CAAC2B,gBAAgB,CAACpB,cAAc;CAChD,CAAC,EACFT,GAAG,CAACgB,IAAI,CAAC,kBAAkB,EAAE;EAC3BC,OAAO,EAAE;IAAEQ,QAAQ,EAAErB,KAAK,CAACsB,OAAO;IAAEa,MAAM,EAAErC,MAAM,CAACiB,MAAM;IAAED,KAAK,EAAEhB,MAAM,CAACiB;EAAM,CAAE;EACjFC,OAAO,EAAEV;CACV,CAAC,CACH,CAAC8B,MAAM,CAAC,QAAQ,CAAC","ignoreList":[]}
@@ -0,0 +1,33 @@
1
+ import { Schema } from 'effect';
2
+ export class EventDiscordMessage extends /*#__PURE__*/Schema.Class('EventDiscordMessage')({
3
+ discord_channel_id: Schema.String,
4
+ discord_message_id: Schema.String
5
+ }) {}
6
+ export class RsvpCountsResult extends /*#__PURE__*/Schema.Class('RsvpCountsResult')({
7
+ yesCount: Schema.Number,
8
+ noCount: Schema.Number,
9
+ maybeCount: Schema.Number,
10
+ canRsvp: Schema.Boolean
11
+ }) {}
12
+ export class EventEmbedInfo extends /*#__PURE__*/Schema.Class('EventEmbedInfo')({
13
+ title: Schema.String,
14
+ description: /*#__PURE__*/Schema.NullOr(Schema.String),
15
+ start_at: Schema.String,
16
+ end_at: /*#__PURE__*/Schema.NullOr(Schema.String),
17
+ location: /*#__PURE__*/Schema.NullOr(Schema.String),
18
+ event_type: Schema.String
19
+ }) {}
20
+ export class RsvpMemberNotFound extends /*#__PURE__*/Schema.TaggedError()('RsvpMemberNotFound', {}) {}
21
+ export class RsvpDeadlinePassed extends /*#__PURE__*/Schema.TaggedError()('RsvpDeadlinePassed', {}) {}
22
+ export class RsvpEventNotFound extends /*#__PURE__*/Schema.TaggedError()('RsvpEventNotFound', {}) {}
23
+ export class RsvpAttendeeEntry extends /*#__PURE__*/Schema.Class('RsvpAttendeeEntry')({
24
+ discord_id: /*#__PURE__*/Schema.NullOr(Schema.String),
25
+ name: /*#__PURE__*/Schema.NullOr(Schema.String),
26
+ response: /*#__PURE__*/Schema.Literal('yes', 'no', 'maybe'),
27
+ message: /*#__PURE__*/Schema.NullOr(Schema.String)
28
+ }) {}
29
+ export class RsvpAttendeesResult extends /*#__PURE__*/Schema.Class('RsvpAttendeesResult')({
30
+ attendees: /*#__PURE__*/Schema.Array(RsvpAttendeeEntry),
31
+ total: Schema.Number
32
+ }) {}
33
+ //# sourceMappingURL=EventRpcModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventRpcModels.js","names":["Schema","EventDiscordMessage","Class","discord_channel_id","String","discord_message_id","RsvpCountsResult","yesCount","Number","noCount","maybeCount","canRsvp","Boolean","EventEmbedInfo","title","description","NullOr","start_at","end_at","location","event_type","RsvpMemberNotFound","TaggedError","RsvpDeadlinePassed","RsvpEventNotFound","RsvpAttendeeEntry","discord_id","name","response","Literal","message","RsvpAttendeesResult","attendees","Array","total"],"sources":["../../../../src/rpc/event/EventRpcModels.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,MAAM,QAAQ,QAAQ;AAE/B,OAAM,MAAOC,mBAAoB,sBAAQD,MAAM,CAACE,KAAK,CAAsB,qBAAqB,CAAC,CAAC;EAChGC,kBAAkB,EAAEH,MAAM,CAACI,MAAM;EACjCC,kBAAkB,EAAEL,MAAM,CAACI;CAC5B,CAAC;AAEF,OAAM,MAAOE,gBAAiB,sBAAQN,MAAM,CAACE,KAAK,CAAmB,kBAAkB,CAAC,CAAC;EACvFK,QAAQ,EAAEP,MAAM,CAACQ,MAAM;EACvBC,OAAO,EAAET,MAAM,CAACQ,MAAM;EACtBE,UAAU,EAAEV,MAAM,CAACQ,MAAM;EACzBG,OAAO,EAAEX,MAAM,CAACY;CACjB,CAAC;AAEF,OAAM,MAAOC,cAAe,sBAAQb,MAAM,CAACE,KAAK,CAAiB,gBAAgB,CAAC,CAAC;EACjFY,KAAK,EAAEd,MAAM,CAACI,MAAM;EACpBW,WAAW,eAAEf,MAAM,CAACgB,MAAM,CAAChB,MAAM,CAACI,MAAM,CAAC;EACzCa,QAAQ,EAAEjB,MAAM,CAACI,MAAM;EACvBc,MAAM,eAAElB,MAAM,CAACgB,MAAM,CAAChB,MAAM,CAACI,MAAM,CAAC;EACpCe,QAAQ,eAAEnB,MAAM,CAACgB,MAAM,CAAChB,MAAM,CAACI,MAAM,CAAC;EACtCgB,UAAU,EAAEpB,MAAM,CAACI;CACpB,CAAC;AAEF,OAAM,MAAOiB,kBAAmB,sBAAQrB,MAAM,CAACsB,WAAW,EAAsB,CAC9E,oBAAoB,EACpB,EAAE,CACH;AAED,OAAM,MAAOC,kBAAmB,sBAAQvB,MAAM,CAACsB,WAAW,EAAsB,CAC9E,oBAAoB,EACpB,EAAE,CACH;AAED,OAAM,MAAOE,iBAAkB,sBAAQxB,MAAM,CAACsB,WAAW,EAAqB,CAC5E,mBAAmB,EACnB,EAAE,CACH;AAED,OAAM,MAAOG,iBAAkB,sBAAQzB,MAAM,CAACE,KAAK,CAAoB,mBAAmB,CAAC,CAAC;EAC1FwB,UAAU,eAAE1B,MAAM,CAACgB,MAAM,CAAChB,MAAM,CAACI,MAAM,CAAC;EACxCuB,IAAI,eAAE3B,MAAM,CAACgB,MAAM,CAAChB,MAAM,CAACI,MAAM,CAAC;EAClCwB,QAAQ,eAAE5B,MAAM,CAAC6B,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC;EAC9CC,OAAO,eAAE9B,MAAM,CAACgB,MAAM,CAAChB,MAAM,CAACI,MAAM;CACrC,CAAC;AAEF,OAAM,MAAO2B,mBAAoB,sBAAQ/B,MAAM,CAACE,KAAK,CAAsB,qBAAqB,CAAC,CAAC;EAChG8B,SAAS,eAAEhC,MAAM,CAACiC,KAAK,CAACR,iBAAiB,CAAC;EAC1CS,KAAK,EAAElC,MAAM,CAACQ;CACf,CAAC","ignoreList":[]}
@@ -0,0 +1,29 @@
1
+ import { Rpc, RpcGroup } from '@effect/rpc';
2
+ import { Schema } from 'effect';
3
+ import { Discord } from '../../index.js';
4
+ export const GuildRpcGroup = /*#__PURE__*/RpcGroup.make(Rpc.make('RegisterGuild', {
5
+ payload: {
6
+ guild_id: Discord.Snowflake,
7
+ guild_name: Schema.String
8
+ }
9
+ }), Rpc.make('UnregisterGuild', {
10
+ payload: {
11
+ guild_id: Discord.Snowflake
12
+ }
13
+ }), Rpc.make('IsGuildRegistered', {
14
+ payload: {
15
+ guild_id: Discord.Snowflake
16
+ },
17
+ success: Schema.Boolean
18
+ }), Rpc.make('SyncGuildChannels', {
19
+ payload: {
20
+ guild_id: Discord.Snowflake,
21
+ channels: Schema.Array(Schema.Struct({
22
+ channel_id: Discord.Snowflake,
23
+ name: Schema.String,
24
+ type: Schema.Number,
25
+ parent_id: Schema.NullOr(Discord.Snowflake)
26
+ }))
27
+ }
28
+ })).prefix('Guild/');
29
+ //# sourceMappingURL=GuildRpcGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GuildRpcGroup.js","names":["Rpc","RpcGroup","Schema","Discord","GuildRpcGroup","make","payload","guild_id","Snowflake","guild_name","String","success","Boolean","channels","Array","Struct","channel_id","name","type","Number","parent_id","NullOr","prefix"],"sources":["../../../../src/rpc/guild/GuildRpcGroup.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,GAAG,EAAEC,QAAQ,QAAQ,aAAa;AAC3C,SAASC,MAAM,QAAQ,QAAQ;AAC/B,SAASC,OAAO,QAAQ,gBAAa;AAErC,OAAO,MAAMC,aAAa,gBAAGH,QAAQ,CAACI,IAAI,CACxCL,GAAG,CAACK,IAAI,CAAC,eAAe,EAAE;EACxBC,OAAO,EAAE;IAAEC,QAAQ,EAAEJ,OAAO,CAACK,SAAS;IAAEC,UAAU,EAAEP,MAAM,CAACQ;EAAM;CAClE,CAAC,EACFV,GAAG,CAACK,IAAI,CAAC,iBAAiB,EAAE;EAC1BC,OAAO,EAAE;IAAEC,QAAQ,EAAEJ,OAAO,CAACK;EAAS;CACvC,CAAC,EACFR,GAAG,CAACK,IAAI,CAAC,mBAAmB,EAAE;EAC5BC,OAAO,EAAE;IAAEC,QAAQ,EAAEJ,OAAO,CAACK;EAAS,CAAE;EACxCG,OAAO,EAAET,MAAM,CAACU;CACjB,CAAC,EACFZ,GAAG,CAACK,IAAI,CAAC,mBAAmB,EAAE;EAC5BC,OAAO,EAAE;IACPC,QAAQ,EAAEJ,OAAO,CAACK,SAAS;IAC3BK,QAAQ,EAAEX,MAAM,CAACY,KAAK,CACpBZ,MAAM,CAACa,MAAM,CAAC;MACZC,UAAU,EAAEb,OAAO,CAACK,SAAS;MAC7BS,IAAI,EAAEf,MAAM,CAACQ,MAAM;MACnBQ,IAAI,EAAEhB,MAAM,CAACiB,MAAM;MACnBC,SAAS,EAAElB,MAAM,CAACmB,MAAM,CAAClB,OAAO,CAACK,SAAS;KAC3C,CAAC;;CAGP,CAAC,CACH,CAACc,MAAM,CAAC,QAAQ,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sideline/domain",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "The domain template",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -14,7 +14,8 @@
14
14
  "@effect/platform": "0.94.5",
15
15
  "@effect/rpc": "0.73.0",
16
16
  "@effect/sql": "0.49.0",
17
- "effect": "3.19.18"
17
+ "effect": "3.19.18",
18
+ "@sideline/effect-lib": "0.0.3"
18
19
  },
19
20
  "main": "./dist/cjs/index.js",
20
21
  "module": "./dist/esm/index.js",
@@ -2,31 +2,31 @@ import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from '@effect/platform';
2
2
  import { Schema } from 'effect';
3
3
  import { AuthMiddleware } from '~/api/Auth.js';
4
4
  import { AgeThresholdRuleId } from '~/models/AgeThresholdRule.js';
5
- import { RoleId } from '~/models/Role.js';
5
+ import { GroupId } from '~/models/GroupModel.js';
6
6
  import { TeamId } from '~/models/Team.js';
7
7
  import { TeamMemberId } from '~/models/TeamMember.js';
8
8
 
9
9
  export class AgeThresholdInfo extends Schema.Class<AgeThresholdInfo>('AgeThresholdInfo')({
10
10
  ruleId: AgeThresholdRuleId,
11
11
  teamId: TeamId,
12
- roleId: RoleId,
13
- roleName: Schema.String,
12
+ groupId: GroupId,
13
+ groupName: Schema.String,
14
14
  minAge: Schema.OptionFromNullOr(Schema.Number),
15
15
  maxAge: Schema.OptionFromNullOr(Schema.Number),
16
16
  }) {}
17
17
 
18
- export class AgeRoleChange extends Schema.Class<AgeRoleChange>('AgeRoleChange')({
18
+ export class AgeGroupChange extends Schema.Class<AgeGroupChange>('AgeGroupChange')({
19
19
  memberId: TeamMemberId,
20
20
  memberName: Schema.String,
21
- roleId: RoleId,
22
- roleName: Schema.String,
23
- action: Schema.Literal('assigned', 'removed'),
21
+ groupId: GroupId,
22
+ groupName: Schema.String,
23
+ action: Schema.Literal('added', 'removed'),
24
24
  }) {}
25
25
 
26
26
  export class CreateAgeThresholdRequest extends Schema.Class<CreateAgeThresholdRequest>(
27
27
  'CreateAgeThresholdRequest',
28
28
  )({
29
- roleId: RoleId,
29
+ groupId: GroupId,
30
30
  minAge: Schema.OptionFromNullOr(Schema.Number),
31
31
  maxAge: Schema.OptionFromNullOr(Schema.Number),
32
32
  }) {}
@@ -50,8 +50,8 @@ export class RuleNotFound extends Schema.TaggedError<RuleNotFound>()(
50
50
  HttpApiSchema.annotations({ status: 404 }),
51
51
  ) {}
52
52
 
53
- export class RoleNotFound extends Schema.TaggedError<RoleNotFound>()(
54
- 'AgeThresholdRoleNotFound',
53
+ export class GroupNotFound extends Schema.TaggedError<GroupNotFound>()(
54
+ 'AgeThresholdGroupNotFound',
55
55
  {},
56
56
  HttpApiSchema.annotations({ status: 404 }),
57
57
  ) {}
@@ -68,7 +68,7 @@ export class AgeThresholdApiGroup extends HttpApiGroup.make('ageThreshold')
68
68
  HttpApiEndpoint.post('createAgeThreshold', '/teams/:teamId/age-thresholds')
69
69
  .addSuccess(AgeThresholdInfo, { status: 201 })
70
70
  .addError(Forbidden, { status: 403 })
71
- .addError(RoleNotFound, { status: 404 })
71
+ .addError(GroupNotFound, { status: 404 })
72
72
  .setPath(Schema.Struct({ teamId: TeamId }))
73
73
  .setPayload(CreateAgeThresholdRequest)
74
74
  .middleware(AuthMiddleware),
@@ -92,7 +92,7 @@ export class AgeThresholdApiGroup extends HttpApiGroup.make('ageThreshold')
92
92
  )
93
93
  .add(
94
94
  HttpApiEndpoint.post('evaluateAgeThresholds', '/teams/:teamId/age-thresholds/evaluate')
95
- .addSuccess(Schema.Array(AgeRoleChange))
95
+ .addSuccess(Schema.Array(AgeGroupChange))
96
96
  .addError(Forbidden, { status: 403 })
97
97
  .setPath(Schema.Struct({ teamId: TeamId }))
98
98
  .middleware(AuthMiddleware),
package/src/api/Auth.ts CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  HttpApiSecurity,
7
7
  } from '@effect/platform';
8
8
  import { Context, Schema } from 'effect';
9
+ import { Snowflake } from '~/models/Discord.js';
9
10
  import { Permission } from '~/models/Role.js';
10
11
  import { TeamId } from '~/models/Team.js';
11
12
  import { Gender, Locale, UserId } from '~/models/User.js';
@@ -28,7 +29,7 @@ export class CurrentUser extends Schema.Class<CurrentUser>('CurrentUser')({
28
29
  discordAvatar: Schema.NullOr(Schema.String),
29
30
  isProfileComplete: Schema.Boolean,
30
31
  name: Schema.NullOr(Schema.String),
31
- birthYear: Schema.NullOr(Schema.Number),
32
+ birthDate: Schema.NullOr(Schema.String),
32
33
  gender: Schema.NullOr(Gender),
33
34
  locale: Locale,
34
35
  }) {}
@@ -39,17 +40,30 @@ export class UpdateLocaleRequest extends Schema.Class<UpdateLocaleRequest>('Upda
39
40
 
40
41
  export class CreateTeamRequest extends Schema.Class<CreateTeamRequest>('CreateTeamRequest')({
41
42
  name: Schema.String.pipe(Schema.minLength(1), Schema.maxLength(100)),
43
+ guildId: Snowflake,
44
+ }) {}
45
+
46
+ export class DiscordGuild extends Schema.Class<DiscordGuild>('DiscordGuild')({
47
+ id: Snowflake,
48
+ name: Schema.String,
49
+ icon: Schema.NullOr(Schema.String),
50
+ owner: Schema.Boolean,
51
+ botPresent: Schema.Boolean,
42
52
  }) {}
43
53
 
44
54
  export class CompleteProfileRequest extends Schema.Class<CompleteProfileRequest>(
45
55
  'CompleteProfileRequest',
46
56
  )({
47
57
  name: Schema.String,
48
- birthYear: Schema.Number.pipe(
49
- Schema.int(),
50
- Schema.greaterThanOrEqualTo(1900),
51
- Schema.filter((year) => year <= new Date().getFullYear() - MIN_AGE, {
52
- message: () => `Birth year must be at most ${new Date().getFullYear() - MIN_AGE}`,
58
+ birthDate: Schema.String.pipe(
59
+ Schema.filter((s) => {
60
+ const d = new Date(s);
61
+ if (Number.isNaN(d.getTime())) return 'Invalid date';
62
+ if (d < new Date('1900-01-01')) return 'Date must be after 1900-01-01';
63
+ const minDate = new Date();
64
+ minDate.setFullYear(minDate.getFullYear() - MIN_AGE);
65
+ if (d > minDate) return `Must be at least ${MIN_AGE} years old`;
66
+ return true;
53
67
  }),
54
68
  ),
55
69
  gender: Gender,
@@ -59,12 +73,16 @@ export class UpdateProfileRequest extends Schema.Class<UpdateProfileRequest>(
59
73
  'UpdateProfileRequest',
60
74
  )({
61
75
  name: Schema.NullOr(Schema.String),
62
- birthYear: Schema.NullOr(
63
- Schema.Number.pipe(
64
- Schema.int(),
65
- Schema.greaterThanOrEqualTo(1900),
66
- Schema.filter((year) => year <= new Date().getFullYear() - MIN_AGE, {
67
- message: () => `Birth year must be at most ${new Date().getFullYear() - MIN_AGE}`,
76
+ birthDate: Schema.OptionFromNullOr(
77
+ Schema.String.pipe(
78
+ Schema.filter((s) => {
79
+ const d = new Date(s);
80
+ if (Number.isNaN(d.getTime())) return 'Invalid date';
81
+ if (d < new Date('1900-01-01')) return 'Date must be after 1900-01-01';
82
+ const minDate = new Date();
83
+ minDate.setFullYear(minDate.getFullYear() - MIN_AGE);
84
+ if (d > minDate) return `Must be at least ${MIN_AGE} years old`;
85
+ return true;
68
86
  }),
69
87
  ),
70
88
  ),
@@ -135,6 +153,12 @@ export class AuthApiGroup extends HttpApiGroup.make('auth')
135
153
  .addError(Unauthorized, { status: 401 })
136
154
  .middleware(AuthMiddleware),
137
155
  )
156
+ .add(
157
+ HttpApiEndpoint.get('myGuilds', '/me/guilds')
158
+ .addSuccess(Schema.Array(DiscordGuild))
159
+ .addError(Unauthorized, { status: 401 })
160
+ .middleware(AuthMiddleware),
161
+ )
138
162
  .add(
139
163
  HttpApiEndpoint.post('createTeam', '/me/teams')
140
164
  .addSuccess(UserTeam)
@@ -0,0 +1,129 @@
1
+ import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from '@effect/platform';
2
+ import { Schema } from 'effect';
3
+ import { AuthMiddleware } from '~/api/Auth.js';
4
+ import { EventId, EventStatus, EventType } from '~/models/Event.js';
5
+ import { EventSeriesId } from '~/models/EventSeries.js';
6
+ import { TeamId } from '~/models/Team.js';
7
+ import { TrainingTypeId } from '~/models/TrainingType.js';
8
+
9
+ export class EventInfo extends Schema.Class<EventInfo>('EventInfo')({
10
+ eventId: EventId,
11
+ teamId: TeamId,
12
+ title: Schema.String,
13
+ eventType: EventType,
14
+ trainingTypeName: Schema.NullOr(Schema.String),
15
+ startAt: Schema.String,
16
+ endAt: Schema.NullOr(Schema.String),
17
+ location: Schema.NullOr(Schema.String),
18
+ status: EventStatus,
19
+ seriesId: Schema.NullOr(EventSeriesId),
20
+ }) {}
21
+
22
+ export class EventDetail extends Schema.Class<EventDetail>('EventDetail')({
23
+ eventId: EventId,
24
+ teamId: TeamId,
25
+ title: Schema.String,
26
+ eventType: EventType,
27
+ trainingTypeId: Schema.NullOr(TrainingTypeId),
28
+ trainingTypeName: Schema.NullOr(Schema.String),
29
+ description: Schema.NullOr(Schema.String),
30
+ startAt: Schema.String,
31
+ endAt: Schema.NullOr(Schema.String),
32
+ location: Schema.NullOr(Schema.String),
33
+ status: EventStatus,
34
+ createdByName: Schema.NullOr(Schema.String),
35
+ canEdit: Schema.Boolean,
36
+ canCancel: Schema.Boolean,
37
+ seriesId: Schema.NullOr(EventSeriesId),
38
+ seriesModified: Schema.Boolean,
39
+ discordChannelId: Schema.NullOr(Schema.String),
40
+ }) {}
41
+
42
+ export class EventListResponse extends Schema.Class<EventListResponse>('EventListResponse')({
43
+ canCreate: Schema.Boolean,
44
+ events: Schema.Array(EventInfo),
45
+ }) {}
46
+
47
+ export class CreateEventRequest extends Schema.Class<CreateEventRequest>('CreateEventRequest')({
48
+ title: Schema.NonEmptyString,
49
+ eventType: EventType,
50
+ trainingTypeId: Schema.NullOr(TrainingTypeId),
51
+ description: Schema.NullOr(Schema.String),
52
+ startAt: Schema.String,
53
+ endAt: Schema.NullOr(Schema.String),
54
+ location: Schema.NullOr(Schema.String),
55
+ discordChannelId: Schema.NullOr(Schema.String),
56
+ }) {}
57
+
58
+ export class UpdateEventRequest extends Schema.Class<UpdateEventRequest>('UpdateEventRequest')({
59
+ title: Schema.optionalWith(Schema.NonEmptyString, { as: 'Option' }),
60
+ eventType: Schema.optionalWith(EventType, { as: 'Option' }),
61
+ trainingTypeId: Schema.optionalWith(Schema.OptionFromNullOr(TrainingTypeId), { as: 'Option' }),
62
+ description: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), { as: 'Option' }),
63
+ startAt: Schema.optionalWith(Schema.String, { as: 'Option' }),
64
+ endAt: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), { as: 'Option' }),
65
+ location: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), { as: 'Option' }),
66
+ discordChannelId: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), { as: 'Option' }),
67
+ }) {}
68
+
69
+ export class EventNotFound extends Schema.TaggedError<EventNotFound>()(
70
+ 'EventNotFound',
71
+ {},
72
+ HttpApiSchema.annotations({ status: 404 }),
73
+ ) {}
74
+
75
+ export class Forbidden extends Schema.TaggedError<Forbidden>()(
76
+ 'EventForbidden',
77
+ {},
78
+ HttpApiSchema.annotations({ status: 403 }),
79
+ ) {}
80
+
81
+ export class EventCancelled extends Schema.TaggedError<EventCancelled>()(
82
+ 'EventCancelled',
83
+ {},
84
+ HttpApiSchema.annotations({ status: 400 }),
85
+ ) {}
86
+
87
+ export class EventApiGroup extends HttpApiGroup.make('event')
88
+ .add(
89
+ HttpApiEndpoint.get('listEvents', '/teams/:teamId/events')
90
+ .addSuccess(EventListResponse)
91
+ .addError(Forbidden, { status: 403 })
92
+ .setPath(Schema.Struct({ teamId: TeamId }))
93
+ .middleware(AuthMiddleware),
94
+ )
95
+ .add(
96
+ HttpApiEndpoint.post('createEvent', '/teams/:teamId/events')
97
+ .addSuccess(EventInfo, { status: 201 })
98
+ .addError(Forbidden, { status: 403 })
99
+ .setPath(Schema.Struct({ teamId: TeamId }))
100
+ .setPayload(CreateEventRequest)
101
+ .middleware(AuthMiddleware),
102
+ )
103
+ .add(
104
+ HttpApiEndpoint.get('getEvent', '/teams/:teamId/events/:eventId')
105
+ .addSuccess(EventDetail)
106
+ .addError(Forbidden, { status: 403 })
107
+ .addError(EventNotFound, { status: 404 })
108
+ .setPath(Schema.Struct({ teamId: TeamId, eventId: EventId }))
109
+ .middleware(AuthMiddleware),
110
+ )
111
+ .add(
112
+ HttpApiEndpoint.patch('updateEvent', '/teams/:teamId/events/:eventId')
113
+ .addSuccess(EventDetail)
114
+ .addError(Forbidden, { status: 403 })
115
+ .addError(EventNotFound, { status: 404 })
116
+ .addError(EventCancelled, { status: 400 })
117
+ .setPath(Schema.Struct({ teamId: TeamId, eventId: EventId }))
118
+ .setPayload(UpdateEventRequest)
119
+ .middleware(AuthMiddleware),
120
+ )
121
+ .add(
122
+ HttpApiEndpoint.post('cancelEvent', '/teams/:teamId/events/:eventId/cancel')
123
+ .addSuccess(Schema.Void, { status: 204 })
124
+ .addError(Forbidden, { status: 403 })
125
+ .addError(EventNotFound, { status: 404 })
126
+ .addError(EventCancelled, { status: 400 })
127
+ .setPath(Schema.Struct({ teamId: TeamId, eventId: EventId }))
128
+ .middleware(AuthMiddleware),
129
+ ) {}
@@ -0,0 +1,67 @@
1
+ import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from '@effect/platform';
2
+ import { Schema } from 'effect';
3
+ import { AuthMiddleware } from '~/api/Auth.js';
4
+ import { EventId } from '~/models/Event.js';
5
+ import { RsvpResponse } from '~/models/EventRsvp.js';
6
+ import { TeamId } from '~/models/Team.js';
7
+ import { TeamMemberId } from '~/models/TeamMember.js';
8
+
9
+ export class RsvpEntry extends Schema.Class<RsvpEntry>('RsvpEntry')({
10
+ teamMemberId: TeamMemberId,
11
+ memberName: Schema.NullOr(Schema.String),
12
+ response: RsvpResponse,
13
+ message: Schema.NullOr(Schema.String),
14
+ }) {}
15
+
16
+ export class EventRsvpDetail extends Schema.Class<EventRsvpDetail>('EventRsvpDetail')({
17
+ myResponse: Schema.NullOr(RsvpResponse),
18
+ myMessage: Schema.NullOr(Schema.String),
19
+ rsvps: Schema.Array(RsvpEntry),
20
+ yesCount: Schema.Number,
21
+ noCount: Schema.Number,
22
+ maybeCount: Schema.Number,
23
+ canRsvp: Schema.Boolean,
24
+ }) {}
25
+
26
+ export class SubmitRsvpRequest extends Schema.Class<SubmitRsvpRequest>('SubmitRsvpRequest')({
27
+ response: RsvpResponse,
28
+ message: Schema.NullOr(Schema.String),
29
+ }) {}
30
+
31
+ export class EventNotFound extends Schema.TaggedError<EventNotFound>()(
32
+ 'EventRsvpEventNotFound',
33
+ {},
34
+ HttpApiSchema.annotations({ status: 404 }),
35
+ ) {}
36
+
37
+ export class Forbidden extends Schema.TaggedError<Forbidden>()(
38
+ 'EventRsvpForbidden',
39
+ {},
40
+ HttpApiSchema.annotations({ status: 403 }),
41
+ ) {}
42
+
43
+ export class RsvpDeadlinePassed extends Schema.TaggedError<RsvpDeadlinePassed>()(
44
+ 'RsvpDeadlinePassed',
45
+ {},
46
+ HttpApiSchema.annotations({ status: 400 }),
47
+ ) {}
48
+
49
+ export class EventRsvpApiGroup extends HttpApiGroup.make('eventRsvp')
50
+ .add(
51
+ HttpApiEndpoint.get('getRsvps', '/teams/:teamId/events/:eventId/rsvps')
52
+ .addSuccess(EventRsvpDetail)
53
+ .addError(Forbidden, { status: 403 })
54
+ .addError(EventNotFound, { status: 404 })
55
+ .setPath(Schema.Struct({ teamId: TeamId, eventId: EventId }))
56
+ .middleware(AuthMiddleware),
57
+ )
58
+ .add(
59
+ HttpApiEndpoint.put('submitRsvp', '/teams/:teamId/events/:eventId/rsvp')
60
+ .addSuccess(EventRsvpDetail)
61
+ .addError(Forbidden, { status: 403 })
62
+ .addError(EventNotFound, { status: 404 })
63
+ .addError(RsvpDeadlinePassed, { status: 400 })
64
+ .setPath(Schema.Struct({ teamId: TeamId, eventId: EventId }))
65
+ .setPayload(SubmitRsvpRequest)
66
+ .middleware(AuthMiddleware),
67
+ ) {}
@@ -0,0 +1,134 @@
1
+ import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from '@effect/platform';
2
+ import { Schema } from 'effect';
3
+ import { AuthMiddleware } from '~/api/Auth.js';
4
+ import { Forbidden } from '~/api/EventApi.js';
5
+ import {
6
+ DayOfWeek,
7
+ EventSeriesId,
8
+ EventSeriesStatus,
9
+ RecurrenceFrequency,
10
+ } from '~/models/EventSeries.js';
11
+ import { TeamId } from '~/models/Team.js';
12
+ import { TrainingTypeId } from '~/models/TrainingType.js';
13
+
14
+ export class EventSeriesInfo extends Schema.Class<EventSeriesInfo>('EventSeriesInfo')({
15
+ seriesId: EventSeriesId,
16
+ teamId: TeamId,
17
+ title: Schema.String,
18
+ frequency: RecurrenceFrequency,
19
+ dayOfWeek: DayOfWeek,
20
+ startDate: Schema.String,
21
+ endDate: Schema.NullOr(Schema.String),
22
+ status: EventSeriesStatus,
23
+ trainingTypeId: Schema.NullOr(TrainingTypeId),
24
+ trainingTypeName: Schema.NullOr(Schema.String),
25
+ startTime: Schema.String,
26
+ endTime: Schema.NullOr(Schema.String),
27
+ location: Schema.NullOr(Schema.String),
28
+ discordChannelId: Schema.NullOr(Schema.String),
29
+ }) {}
30
+
31
+ export class EventSeriesDetail extends Schema.Class<EventSeriesDetail>('EventSeriesDetail')({
32
+ seriesId: EventSeriesId,
33
+ teamId: TeamId,
34
+ title: Schema.String,
35
+ description: Schema.NullOr(Schema.String),
36
+ frequency: RecurrenceFrequency,
37
+ dayOfWeek: DayOfWeek,
38
+ startDate: Schema.String,
39
+ endDate: Schema.NullOr(Schema.String),
40
+ status: EventSeriesStatus,
41
+ trainingTypeId: Schema.NullOr(TrainingTypeId),
42
+ trainingTypeName: Schema.NullOr(Schema.String),
43
+ startTime: Schema.String,
44
+ endTime: Schema.NullOr(Schema.String),
45
+ location: Schema.NullOr(Schema.String),
46
+ discordChannelId: Schema.NullOr(Schema.String),
47
+ canEdit: Schema.Boolean,
48
+ canCancel: Schema.Boolean,
49
+ }) {}
50
+
51
+ export class CreateEventSeriesRequest extends Schema.Class<CreateEventSeriesRequest>(
52
+ 'CreateEventSeriesRequest',
53
+ )({
54
+ title: Schema.NonEmptyString,
55
+ trainingTypeId: Schema.NullOr(TrainingTypeId),
56
+ description: Schema.NullOr(Schema.String),
57
+ frequency: RecurrenceFrequency,
58
+ dayOfWeek: DayOfWeek,
59
+ startDate: Schema.String,
60
+ endDate: Schema.NullOr(Schema.String),
61
+ startTime: Schema.String,
62
+ endTime: Schema.NullOr(Schema.String),
63
+ location: Schema.NullOr(Schema.String),
64
+ discordChannelId: Schema.NullOr(Schema.String),
65
+ }) {}
66
+
67
+ export class UpdateEventSeriesRequest extends Schema.Class<UpdateEventSeriesRequest>(
68
+ 'UpdateEventSeriesRequest',
69
+ )({
70
+ title: Schema.optionalWith(Schema.NonEmptyString, { as: 'Option' }),
71
+ trainingTypeId: Schema.optionalWith(Schema.OptionFromNullOr(TrainingTypeId), { as: 'Option' }),
72
+ description: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), { as: 'Option' }),
73
+ startTime: Schema.optionalWith(Schema.String, { as: 'Option' }),
74
+ endTime: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), { as: 'Option' }),
75
+ location: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), { as: 'Option' }),
76
+ endDate: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), { as: 'Option' }),
77
+ discordChannelId: Schema.optionalWith(Schema.OptionFromNullOr(Schema.String), { as: 'Option' }),
78
+ }) {}
79
+
80
+ export class EventSeriesNotFound extends Schema.TaggedError<EventSeriesNotFound>()(
81
+ 'EventSeriesNotFound',
82
+ {},
83
+ HttpApiSchema.annotations({ status: 404 }),
84
+ ) {}
85
+
86
+ export class EventSeriesCancelled extends Schema.TaggedError<EventSeriesCancelled>()(
87
+ 'EventSeriesCancelled',
88
+ {},
89
+ HttpApiSchema.annotations({ status: 400 }),
90
+ ) {}
91
+
92
+ export class EventSeriesApiGroup extends HttpApiGroup.make('eventSeries')
93
+ .add(
94
+ HttpApiEndpoint.post('createEventSeries', '/teams/:teamId/event-series')
95
+ .addSuccess(EventSeriesInfo, { status: 201 })
96
+ .addError(Forbidden, { status: 403 })
97
+ .setPath(Schema.Struct({ teamId: TeamId }))
98
+ .setPayload(CreateEventSeriesRequest)
99
+ .middleware(AuthMiddleware),
100
+ )
101
+ .add(
102
+ HttpApiEndpoint.get('listEventSeries', '/teams/:teamId/event-series')
103
+ .addSuccess(Schema.Array(EventSeriesInfo))
104
+ .addError(Forbidden, { status: 403 })
105
+ .setPath(Schema.Struct({ teamId: TeamId }))
106
+ .middleware(AuthMiddleware),
107
+ )
108
+ .add(
109
+ HttpApiEndpoint.get('getEventSeries', '/teams/:teamId/event-series/:seriesId')
110
+ .addSuccess(EventSeriesDetail)
111
+ .addError(Forbidden, { status: 403 })
112
+ .addError(EventSeriesNotFound, { status: 404 })
113
+ .setPath(Schema.Struct({ teamId: TeamId, seriesId: EventSeriesId }))
114
+ .middleware(AuthMiddleware),
115
+ )
116
+ .add(
117
+ HttpApiEndpoint.patch('updateEventSeries', '/teams/:teamId/event-series/:seriesId')
118
+ .addSuccess(EventSeriesDetail)
119
+ .addError(Forbidden, { status: 403 })
120
+ .addError(EventSeriesNotFound, { status: 404 })
121
+ .addError(EventSeriesCancelled, { status: 400 })
122
+ .setPath(Schema.Struct({ teamId: TeamId, seriesId: EventSeriesId }))
123
+ .setPayload(UpdateEventSeriesRequest)
124
+ .middleware(AuthMiddleware),
125
+ )
126
+ .add(
127
+ HttpApiEndpoint.post('cancelEventSeries', '/teams/:teamId/event-series/:seriesId/cancel')
128
+ .addSuccess(Schema.Void, { status: 204 })
129
+ .addError(Forbidden, { status: 403 })
130
+ .addError(EventSeriesNotFound, { status: 404 })
131
+ .addError(EventSeriesCancelled, { status: 400 })
132
+ .setPath(Schema.Struct({ teamId: TeamId, seriesId: EventSeriesId }))
133
+ .middleware(AuthMiddleware),
134
+ ) {}