@sideline/domain 0.5.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 (145) hide show
  1. package/dist/cjs/api/Auth.js +17 -5
  2. package/dist/cjs/api/Auth.js.map +1 -1
  3. package/dist/cjs/api/EventApi.js +141 -0
  4. package/dist/cjs/api/EventApi.js.map +1 -0
  5. package/dist/cjs/api/EventRsvpApi.js +66 -0
  6. package/dist/cjs/api/EventRsvpApi.js.map +1 -0
  7. package/dist/cjs/api/EventSeriesApi.js +139 -0
  8. package/dist/cjs/api/EventSeriesApi.js.map +1 -0
  9. package/dist/cjs/api/Roster.js +3 -2
  10. package/dist/cjs/api/Roster.js.map +1 -1
  11. package/dist/cjs/api/TeamSettingsApi.js +55 -0
  12. package/dist/cjs/api/TeamSettingsApi.js.map +1 -0
  13. package/dist/cjs/api/TrainingTypeApi.js +7 -2
  14. package/dist/cjs/api/TrainingTypeApi.js.map +1 -1
  15. package/dist/cjs/index.js +23 -1
  16. package/dist/cjs/models/Event.js +36 -0
  17. package/dist/cjs/models/Event.js.map +1 -0
  18. package/dist/cjs/models/EventRsvp.js +23 -0
  19. package/dist/cjs/models/EventRsvp.js.map +1 -0
  20. package/dist/cjs/models/EventSeries.js +35 -0
  21. package/dist/cjs/models/EventSeries.js.map +1 -0
  22. package/dist/cjs/models/Role.js +3 -3
  23. package/dist/cjs/models/Role.js.map +1 -1
  24. package/dist/cjs/models/Session.js +3 -5
  25. package/dist/cjs/models/Session.js.map +1 -1
  26. package/dist/cjs/models/TeamInvite.js +3 -5
  27. package/dist/cjs/models/TeamInvite.js.map +1 -1
  28. package/dist/cjs/models/TeamSettings.js +17 -0
  29. package/dist/cjs/models/TeamSettings.js.map +1 -0
  30. package/dist/cjs/models/User.js +3 -1
  31. package/dist/cjs/models/User.js.map +1 -1
  32. package/dist/cjs/rpc/SyncRpcs.js +2 -1
  33. package/dist/cjs/rpc/SyncRpcs.js.map +1 -1
  34. package/dist/cjs/rpc/event/EventRpcEvents.js +45 -0
  35. package/dist/cjs/rpc/event/EventRpcEvents.js.map +1 -0
  36. package/dist/cjs/rpc/event/EventRpcGroup.js +65 -0
  37. package/dist/cjs/rpc/event/EventRpcGroup.js.map +1 -0
  38. package/dist/cjs/rpc/event/EventRpcModels.js +47 -0
  39. package/dist/cjs/rpc/event/EventRpcModels.js.map +1 -0
  40. package/dist/dts/api/Auth.d.ts +12 -12
  41. package/dist/dts/api/Auth.d.ts.map +1 -1
  42. package/dist/dts/api/EventApi.d.ts +273 -0
  43. package/dist/dts/api/EventApi.d.ts.map +1 -0
  44. package/dist/dts/api/EventRsvpApi.d.ts +96 -0
  45. package/dist/dts/api/EventRsvpApi.d.ts.map +1 -0
  46. package/dist/dts/api/EventSeriesApi.d.ts +284 -0
  47. package/dist/dts/api/EventSeriesApi.d.ts.map +1 -0
  48. package/dist/dts/api/NotificationApi.d.ts +2 -2
  49. package/dist/dts/api/RoleApi.d.ts +9 -9
  50. package/dist/dts/api/Roster.d.ts +13 -9
  51. package/dist/dts/api/Roster.d.ts.map +1 -1
  52. package/dist/dts/api/TeamSettingsApi.d.ts +107 -0
  53. package/dist/dts/api/TeamSettingsApi.d.ts.map +1 -0
  54. package/dist/dts/api/TrainingTypeApi.d.ts +16 -0
  55. package/dist/dts/api/TrainingTypeApi.d.ts.map +1 -1
  56. package/dist/dts/index.d.ts +11 -0
  57. package/dist/dts/index.d.ts.map +1 -1
  58. package/dist/dts/models/ChannelSyncEvent.d.ts +6 -6
  59. package/dist/dts/models/Event.d.ts +233 -0
  60. package/dist/dts/models/Event.d.ts.map +1 -0
  61. package/dist/dts/models/EventRsvp.d.ts +110 -0
  62. package/dist/dts/models/EventRsvp.d.ts.map +1 -0
  63. package/dist/dts/models/EventSeries.d.ts +248 -0
  64. package/dist/dts/models/EventSeries.d.ts.map +1 -0
  65. package/dist/dts/models/Notification.d.ts +4 -4
  66. package/dist/dts/models/Role.d.ts +4 -4
  67. package/dist/dts/models/Role.d.ts.map +1 -1
  68. package/dist/dts/models/RoleSyncEvent.d.ts +4 -4
  69. package/dist/dts/models/Session.d.ts +6 -6
  70. package/dist/dts/models/Session.d.ts.map +1 -1
  71. package/dist/dts/models/TeamInvite.d.ts +6 -6
  72. package/dist/dts/models/TeamInvite.d.ts.map +1 -1
  73. package/dist/dts/models/TeamSettings.d.ts +70 -0
  74. package/dist/dts/models/TeamSettings.d.ts.map +1 -0
  75. package/dist/dts/models/User.d.ts +11 -11
  76. package/dist/dts/models/User.d.ts.map +1 -1
  77. package/dist/dts/rpc/SyncRpcs.d.ts +28 -1
  78. package/dist/dts/rpc/SyncRpcs.d.ts.map +1 -1
  79. package/dist/dts/rpc/event/EventRpcEvents.d.ts +49 -0
  80. package/dist/dts/rpc/event/EventRpcEvents.d.ts.map +1 -0
  81. package/dist/dts/rpc/event/EventRpcGroup.d.ts +32 -0
  82. package/dist/dts/rpc/event/EventRpcGroup.d.ts.map +1 -0
  83. package/dist/dts/rpc/event/EventRpcModels.d.ts +115 -0
  84. package/dist/dts/rpc/event/EventRpcModels.d.ts.map +1 -0
  85. package/dist/esm/api/Auth.js +17 -5
  86. package/dist/esm/api/Auth.js.map +1 -1
  87. package/dist/esm/api/EventApi.js +126 -0
  88. package/dist/esm/api/EventApi.js.map +1 -0
  89. package/dist/esm/api/EventRsvpApi.js +53 -0
  90. package/dist/esm/api/EventRsvpApi.js.map +1 -0
  91. package/dist/esm/api/EventSeriesApi.js +126 -0
  92. package/dist/esm/api/EventSeriesApi.js.map +1 -0
  93. package/dist/esm/api/Roster.js +3 -2
  94. package/dist/esm/api/Roster.js.map +1 -1
  95. package/dist/esm/api/TeamSettingsApi.js +46 -0
  96. package/dist/esm/api/TeamSettingsApi.js.map +1 -0
  97. package/dist/esm/api/TrainingTypeApi.js +7 -2
  98. package/dist/esm/api/TrainingTypeApi.js.map +1 -1
  99. package/dist/esm/index.js +11 -0
  100. package/dist/esm/index.js.map +1 -1
  101. package/dist/esm/models/Event.js +28 -0
  102. package/dist/esm/models/Event.js.map +1 -0
  103. package/dist/esm/models/EventRsvp.js +16 -0
  104. package/dist/esm/models/EventRsvp.js.map +1 -0
  105. package/dist/esm/models/EventSeries.js +28 -0
  106. package/dist/esm/models/EventSeries.js.map +1 -0
  107. package/dist/esm/models/Role.js +3 -3
  108. package/dist/esm/models/Role.js.map +1 -1
  109. package/dist/esm/models/Session.js +3 -6
  110. package/dist/esm/models/Session.js.map +1 -1
  111. package/dist/esm/models/TeamInvite.js +3 -6
  112. package/dist/esm/models/TeamInvite.js.map +1 -1
  113. package/dist/esm/models/TeamSettings.js +10 -0
  114. package/dist/esm/models/TeamSettings.js.map +1 -0
  115. package/dist/esm/models/User.js +2 -1
  116. package/dist/esm/models/User.js.map +1 -1
  117. package/dist/esm/rpc/SyncRpcs.js +2 -1
  118. package/dist/esm/rpc/SyncRpcs.js.map +1 -1
  119. package/dist/esm/rpc/event/EventRpcEvents.js +36 -0
  120. package/dist/esm/rpc/event/EventRpcEvents.js.map +1 -0
  121. package/dist/esm/rpc/event/EventRpcGroup.js +59 -0
  122. package/dist/esm/rpc/event/EventRpcGroup.js.map +1 -0
  123. package/dist/esm/rpc/event/EventRpcModels.js +33 -0
  124. package/dist/esm/rpc/event/EventRpcModels.js.map +1 -0
  125. package/package.json +3 -2
  126. package/src/api/Auth.ts +20 -12
  127. package/src/api/EventApi.ts +129 -0
  128. package/src/api/EventRsvpApi.ts +67 -0
  129. package/src/api/EventSeriesApi.ts +134 -0
  130. package/src/api/Roster.ts +3 -2
  131. package/src/api/TeamSettingsApi.ts +57 -0
  132. package/src/api/TrainingTypeApi.ts +3 -0
  133. package/src/index.ts +19 -0
  134. package/src/models/Event.ts +41 -0
  135. package/src/models/EventRsvp.ts +20 -0
  136. package/src/models/EventSeries.ts +36 -0
  137. package/src/models/Role.ts +16 -1
  138. package/src/models/Session.ts +3 -7
  139. package/src/models/TeamInvite.ts +3 -9
  140. package/src/models/TeamSettings.ts +10 -0
  141. package/src/models/User.ts +2 -1
  142. package/src/rpc/SyncRpcs.ts +7 -1
  143. package/src/rpc/event/EventRpcEvents.ts +48 -0
  144. package/src/rpc/event/EventRpcGroup.ts +60 -0
  145. package/src/rpc/event/EventRpcModels.ts +49 -0
@@ -1,4 +1,5 @@
1
1
  import { Model } from '@effect/sql';
2
+ import * as Schemas from '@sideline/effect-lib/Schemas';
2
3
  import { Schema } from 'effect';
3
4
  export const UserId = /*#__PURE__*/Schema.String.pipe(/*#__PURE__*/Schema.brand('UserId'));
4
5
  export const Gender = /*#__PURE__*/Schema.Literal('male', 'female', 'other');
@@ -11,7 +12,7 @@ export class User extends /*#__PURE__*/Model.Class('User')({
11
12
  discord_access_token: /*#__PURE__*/Model.Sensitive(Schema.String),
12
13
  discord_refresh_token: /*#__PURE__*/Model.Sensitive(/*#__PURE__*/Schema.NullOr(Schema.String)),
13
14
  name: /*#__PURE__*/Schema.NullOr(Schema.String),
14
- birth_year: /*#__PURE__*/Schema.NullOr(Schema.Number),
15
+ birth_date: /*#__PURE__*/Schema.OptionFromNullOr(Schemas.DateTimeFromDate),
15
16
  gender: /*#__PURE__*/Schema.NullOr(Gender),
16
17
  locale: Locale,
17
18
  created_at: Model.DateTimeInsertFromDate,
@@ -1 +1 @@
1
- {"version":3,"file":"User.js","names":["Model","Schema","UserId","String","pipe","brand","Gender","Literal","Locale","User","Class","id","Generated","discord_id","discord_username","discord_avatar","NullOr","discord_access_token","Sensitive","discord_refresh_token","name","birth_year","Number","gender","locale","created_at","DateTimeInsertFromDate","is_profile_complete","Boolean","updated_at","DateTimeUpdateFromDate"],"sources":["../../../src/models/User.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,KAAK,QAAQ,aAAa;AACnC,SAASC,MAAM,QAAQ,QAAQ;AAE/B,OAAO,MAAMC,MAAM,gBAAGD,MAAM,CAACE,MAAM,CAACC,IAAI,cAACH,MAAM,CAACI,KAAK,CAAC,QAAQ,CAAC,CAAC;AAGhE,OAAO,MAAMC,MAAM,gBAAGL,MAAM,CAACM,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC;AAG/D,OAAO,MAAMC,MAAM,gBAAGP,MAAM,CAACM,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;AAGhD,OAAM,MAAOE,IAAK,sBAAQT,KAAK,CAACU,KAAK,CAAO,MAAM,CAAC,CAAC;EAClDC,EAAE,eAAEX,KAAK,CAACY,SAAS,CAACV,MAAM,CAAC;EAC3BW,UAAU,EAAEZ,MAAM,CAACE,MAAM;EACzBW,gBAAgB,EAAEb,MAAM,CAACE,MAAM;EAC/BY,cAAc,eAAEd,MAAM,CAACe,MAAM,CAACf,MAAM,CAACE,MAAM,CAAC;EAC5Cc,oBAAoB,eAAEjB,KAAK,CAACkB,SAAS,CAACjB,MAAM,CAACE,MAAM,CAAC;EACpDgB,qBAAqB,eAAEnB,KAAK,CAACkB,SAAS,cAACjB,MAAM,CAACe,MAAM,CAACf,MAAM,CAACE,MAAM,CAAC,CAAC;EACpEiB,IAAI,eAAEnB,MAAM,CAACe,MAAM,CAACf,MAAM,CAACE,MAAM,CAAC;EAClCkB,UAAU,eAAEpB,MAAM,CAACe,MAAM,CAACf,MAAM,CAACqB,MAAM,CAAC;EACxCC,MAAM,eAAEtB,MAAM,CAACe,MAAM,CAACV,MAAM,CAAC;EAC7BkB,MAAM,EAAEhB,MAAM;EACdiB,UAAU,EAAEzB,KAAK,CAAC0B,sBAAsB;EACxCC,mBAAmB,EAAE1B,MAAM,CAAC2B,OAAO;EACnCC,UAAU,EAAE7B,KAAK,CAAC8B;CACnB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"User.js","names":["Model","Schemas","Schema","UserId","String","pipe","brand","Gender","Literal","Locale","User","Class","id","Generated","discord_id","discord_username","discord_avatar","NullOr","discord_access_token","Sensitive","discord_refresh_token","name","birth_date","OptionFromNullOr","DateTimeFromDate","gender","locale","created_at","DateTimeInsertFromDate","is_profile_complete","Boolean","updated_at","DateTimeUpdateFromDate"],"sources":["../../../src/models/User.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,KAAK,QAAQ,aAAa;AACnC,OAAO,KAAKC,OAAO,MAAM,8BAA8B;AACvD,SAASC,MAAM,QAAQ,QAAQ;AAE/B,OAAO,MAAMC,MAAM,gBAAGD,MAAM,CAACE,MAAM,CAACC,IAAI,cAACH,MAAM,CAACI,KAAK,CAAC,QAAQ,CAAC,CAAC;AAGhE,OAAO,MAAMC,MAAM,gBAAGL,MAAM,CAACM,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC;AAG/D,OAAO,MAAMC,MAAM,gBAAGP,MAAM,CAACM,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;AAGhD,OAAM,MAAOE,IAAK,sBAAQV,KAAK,CAACW,KAAK,CAAO,MAAM,CAAC,CAAC;EAClDC,EAAE,eAAEZ,KAAK,CAACa,SAAS,CAACV,MAAM,CAAC;EAC3BW,UAAU,EAAEZ,MAAM,CAACE,MAAM;EACzBW,gBAAgB,EAAEb,MAAM,CAACE,MAAM;EAC/BY,cAAc,eAAEd,MAAM,CAACe,MAAM,CAACf,MAAM,CAACE,MAAM,CAAC;EAC5Cc,oBAAoB,eAAElB,KAAK,CAACmB,SAAS,CAACjB,MAAM,CAACE,MAAM,CAAC;EACpDgB,qBAAqB,eAAEpB,KAAK,CAACmB,SAAS,cAACjB,MAAM,CAACe,MAAM,CAACf,MAAM,CAACE,MAAM,CAAC,CAAC;EACpEiB,IAAI,eAAEnB,MAAM,CAACe,MAAM,CAACf,MAAM,CAACE,MAAM,CAAC;EAClCkB,UAAU,eAAEpB,MAAM,CAACqB,gBAAgB,CAACtB,OAAO,CAACuB,gBAAgB,CAAC;EAC7DC,MAAM,eAAEvB,MAAM,CAACe,MAAM,CAACV,MAAM,CAAC;EAC7BmB,MAAM,EAAEjB,MAAM;EACdkB,UAAU,EAAE3B,KAAK,CAAC4B,sBAAsB;EACxCC,mBAAmB,EAAE3B,MAAM,CAAC4B,OAAO;EACnCC,UAAU,EAAE/B,KAAK,CAACgC;CACnB,CAAC","ignoreList":[]}
@@ -1,6 +1,7 @@
1
1
  import { RpcGroup } from '@effect/rpc';
2
2
  import { ChannelRpcGroup } from './channel/ChannelRpcGroup.js';
3
+ import { EventRpcGroup } from './event/EventRpcGroup.js';
3
4
  import { GuildRpcGroup } from './guild/GuildRpcGroup.js';
4
5
  import { RoleRpcGroup } from './role/RoleRpcGroup.js';
5
- export class SyncRpcs extends /*#__PURE__*/RpcGroup.make().merge(RoleRpcGroup, ChannelRpcGroup, GuildRpcGroup) {}
6
+ export class SyncRpcs extends /*#__PURE__*/RpcGroup.make().merge(RoleRpcGroup, ChannelRpcGroup, GuildRpcGroup, EventRpcGroup) {}
6
7
  //# sourceMappingURL=SyncRpcs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SyncRpcs.js","names":["RpcGroup","ChannelRpcGroup","GuildRpcGroup","RoleRpcGroup","SyncRpcs","make","merge"],"sources":["../../../src/rpc/SyncRpcs.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAQ,QAAQ,aAAa;AACtC,SAASC,eAAe,QAAQ,8BAA8B;AAC9D,SAASC,aAAa,QAAQ,0BAA0B;AACxD,SAASC,YAAY,QAAQ,wBAAwB;AAErD,OAAM,MAAOC,QAAS,sBAAQJ,QAAQ,CAACK,IAAI,EAAE,CAACC,KAAK,CAACH,YAAY,EAAEF,eAAe,EAAEC,aAAa,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"SyncRpcs.js","names":["RpcGroup","ChannelRpcGroup","EventRpcGroup","GuildRpcGroup","RoleRpcGroup","SyncRpcs","make","merge"],"sources":["../../../src/rpc/SyncRpcs.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAQ,QAAQ,aAAa;AACtC,SAASC,eAAe,QAAQ,8BAA8B;AAC9D,SAASC,aAAa,QAAQ,0BAA0B;AACxD,SAASC,aAAa,QAAQ,0BAA0B;AACxD,SAASC,YAAY,QAAQ,wBAAwB;AAErD,OAAM,MAAOC,QAAS,sBAAQL,QAAQ,CAACM,IAAI,EAAE,CAACC,KAAK,CACjDH,YAAY,EACZH,eAAe,EACfE,aAAa,EACbD,aAAa,CACd","ignoreList":[]}
@@ -0,0 +1,36 @@
1
+ import { Schema } from 'effect';
2
+ import { Discord, Event, Team } from '../../index.js';
3
+ export class EventCreatedEvent extends /*#__PURE__*/Schema.TaggedClass()('event_created', {
4
+ id: Schema.String,
5
+ team_id: Team.TeamId,
6
+ guild_id: Discord.Snowflake,
7
+ event_id: Event.EventId,
8
+ title: Schema.String,
9
+ description: /*#__PURE__*/Schema.NullOr(Schema.String),
10
+ start_at: Schema.String,
11
+ end_at: /*#__PURE__*/Schema.NullOr(Schema.String),
12
+ location: /*#__PURE__*/Schema.NullOr(Schema.String),
13
+ event_type: Schema.String,
14
+ discord_channel_id: /*#__PURE__*/Schema.NullOr(Schema.String)
15
+ }) {}
16
+ export class EventUpdatedEvent extends /*#__PURE__*/Schema.TaggedClass()('event_updated', {
17
+ id: Schema.String,
18
+ team_id: Team.TeamId,
19
+ guild_id: Discord.Snowflake,
20
+ event_id: Event.EventId,
21
+ title: Schema.String,
22
+ description: /*#__PURE__*/Schema.NullOr(Schema.String),
23
+ start_at: Schema.String,
24
+ end_at: /*#__PURE__*/Schema.NullOr(Schema.String),
25
+ location: /*#__PURE__*/Schema.NullOr(Schema.String),
26
+ event_type: Schema.String,
27
+ discord_channel_id: /*#__PURE__*/Schema.NullOr(Schema.String)
28
+ }) {}
29
+ export class EventCancelledEvent extends /*#__PURE__*/Schema.TaggedClass()('event_cancelled', {
30
+ id: Schema.String,
31
+ team_id: Team.TeamId,
32
+ guild_id: Discord.Snowflake,
33
+ event_id: Event.EventId
34
+ }) {}
35
+ export const UnprocessedEventSyncEvent = /*#__PURE__*/Schema.Union(EventCreatedEvent, EventUpdatedEvent, EventCancelledEvent);
36
+ //# sourceMappingURL=EventRpcEvents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventRpcEvents.js","names":["Schema","Discord","Event","Team","EventCreatedEvent","TaggedClass","id","String","team_id","TeamId","guild_id","Snowflake","event_id","EventId","title","description","NullOr","start_at","end_at","location","event_type","discord_channel_id","EventUpdatedEvent","EventCancelledEvent","UnprocessedEventSyncEvent","Union"],"sources":["../../../../src/rpc/event/EventRpcEvents.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,MAAM,QAAQ,QAAQ;AAC/B,SAASC,OAAO,EAAEC,KAAK,EAAEC,IAAI,QAAQ,gBAAa;AAElD,OAAM,MAAOC,iBAAkB,sBAAQJ,MAAM,CAACK,WAAW,EAAqB,CAAC,eAAe,EAAE;EAC9FC,EAAE,EAAEN,MAAM,CAACO,MAAM;EACjBC,OAAO,EAAEL,IAAI,CAACM,MAAM;EACpBC,QAAQ,EAAET,OAAO,CAACU,SAAS;EAC3BC,QAAQ,EAAEV,KAAK,CAACW,OAAO;EACvBC,KAAK,EAAEd,MAAM,CAACO,MAAM;EACpBQ,WAAW,eAAEf,MAAM,CAACgB,MAAM,CAAChB,MAAM,CAACO,MAAM,CAAC;EACzCU,QAAQ,EAAEjB,MAAM,CAACO,MAAM;EACvBW,MAAM,eAAElB,MAAM,CAACgB,MAAM,CAAChB,MAAM,CAACO,MAAM,CAAC;EACpCY,QAAQ,eAAEnB,MAAM,CAACgB,MAAM,CAAChB,MAAM,CAACO,MAAM,CAAC;EACtCa,UAAU,EAAEpB,MAAM,CAACO,MAAM;EACzBc,kBAAkB,eAAErB,MAAM,CAACgB,MAAM,CAAChB,MAAM,CAACO,MAAM;CAChD,CAAC;AAEF,OAAM,MAAOe,iBAAkB,sBAAQtB,MAAM,CAACK,WAAW,EAAqB,CAAC,eAAe,EAAE;EAC9FC,EAAE,EAAEN,MAAM,CAACO,MAAM;EACjBC,OAAO,EAAEL,IAAI,CAACM,MAAM;EACpBC,QAAQ,EAAET,OAAO,CAACU,SAAS;EAC3BC,QAAQ,EAAEV,KAAK,CAACW,OAAO;EACvBC,KAAK,EAAEd,MAAM,CAACO,MAAM;EACpBQ,WAAW,eAAEf,MAAM,CAACgB,MAAM,CAAChB,MAAM,CAACO,MAAM,CAAC;EACzCU,QAAQ,EAAEjB,MAAM,CAACO,MAAM;EACvBW,MAAM,eAAElB,MAAM,CAACgB,MAAM,CAAChB,MAAM,CAACO,MAAM,CAAC;EACpCY,QAAQ,eAAEnB,MAAM,CAACgB,MAAM,CAAChB,MAAM,CAACO,MAAM,CAAC;EACtCa,UAAU,EAAEpB,MAAM,CAACO,MAAM;EACzBc,kBAAkB,eAAErB,MAAM,CAACgB,MAAM,CAAChB,MAAM,CAACO,MAAM;CAChD,CAAC;AAEF,OAAM,MAAOgB,mBAAoB,sBAAQvB,MAAM,CAACK,WAAW,EAAuB,CAChF,iBAAiB,EACjB;EACEC,EAAE,EAAEN,MAAM,CAACO,MAAM;EACjBC,OAAO,EAAEL,IAAI,CAACM,MAAM;EACpBC,QAAQ,EAAET,OAAO,CAACU,SAAS;EAC3BC,QAAQ,EAAEV,KAAK,CAACW;CACjB,CACF;AAED,OAAO,MAAMW,yBAAyB,gBAAGxB,MAAM,CAACyB,KAAK,CACnDrB,iBAAiB,EACjBkB,iBAAiB,EACjBC,mBAAmB,CACpB","ignoreList":[]}
@@ -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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sideline/domain",
3
- "version": "0.5.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",
package/src/api/Auth.ts CHANGED
@@ -29,7 +29,7 @@ export class CurrentUser extends Schema.Class<CurrentUser>('CurrentUser')({
29
29
  discordAvatar: Schema.NullOr(Schema.String),
30
30
  isProfileComplete: Schema.Boolean,
31
31
  name: Schema.NullOr(Schema.String),
32
- birthYear: Schema.NullOr(Schema.Number),
32
+ birthDate: Schema.NullOr(Schema.String),
33
33
  gender: Schema.NullOr(Gender),
34
34
  locale: Locale,
35
35
  }) {}
@@ -55,11 +55,15 @@ export class CompleteProfileRequest extends Schema.Class<CompleteProfileRequest>
55
55
  'CompleteProfileRequest',
56
56
  )({
57
57
  name: Schema.String,
58
- birthYear: Schema.Number.pipe(
59
- Schema.int(),
60
- Schema.greaterThanOrEqualTo(1900),
61
- Schema.filter((year) => year <= new Date().getFullYear() - MIN_AGE, {
62
- 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;
63
67
  }),
64
68
  ),
65
69
  gender: Gender,
@@ -69,12 +73,16 @@ export class UpdateProfileRequest extends Schema.Class<UpdateProfileRequest>(
69
73
  'UpdateProfileRequest',
70
74
  )({
71
75
  name: Schema.NullOr(Schema.String),
72
- birthYear: Schema.NullOr(
73
- Schema.Number.pipe(
74
- Schema.int(),
75
- Schema.greaterThanOrEqualTo(1900),
76
- Schema.filter((year) => year <= new Date().getFullYear() - MIN_AGE, {
77
- 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;
78
86
  }),
79
87
  ),
80
88
  ),
@@ -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
+ ) {}
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
  }) {}