@sideline/domain 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/dist/cjs/api/AgeThresholdApi.js +20 -20
  2. package/dist/cjs/api/AgeThresholdApi.js.map +1 -1
  3. package/dist/cjs/api/Auth.js +16 -15
  4. package/dist/cjs/api/Auth.js.map +1 -1
  5. package/dist/cjs/api/GroupApi.js +205 -0
  6. package/dist/cjs/api/GroupApi.js.map +1 -0
  7. package/dist/cjs/api/NotificationApi.js +6 -2
  8. package/dist/cjs/api/NotificationApi.js.map +1 -1
  9. package/dist/cjs/api/Roster.js +1 -5
  10. package/dist/cjs/api/Roster.js.map +1 -1
  11. package/dist/cjs/api/TrainingTypeApi.js +84 -0
  12. package/dist/cjs/api/TrainingTypeApi.js.map +1 -0
  13. package/dist/cjs/index.js +33 -7
  14. package/dist/cjs/models/AgeThresholdRule.js +2 -2
  15. package/dist/cjs/models/AgeThresholdRule.js.map +1 -1
  16. package/dist/cjs/models/ChannelSyncEvent.js +28 -0
  17. package/dist/cjs/models/ChannelSyncEvent.js.map +1 -0
  18. package/dist/cjs/models/Discord.js +9 -0
  19. package/dist/cjs/models/Discord.js.map +1 -0
  20. package/dist/cjs/models/DiscordChannelMapping.js +21 -0
  21. package/dist/cjs/models/DiscordChannelMapping.js.map +1 -0
  22. package/dist/cjs/models/GroupModel.js +20 -0
  23. package/dist/cjs/models/GroupModel.js.map +1 -0
  24. package/dist/cjs/models/Notification.js +1 -1
  25. package/dist/cjs/models/Notification.js.map +1 -1
  26. package/dist/cjs/models/Role.js +2 -2
  27. package/dist/cjs/models/Role.js.map +1 -1
  28. package/dist/cjs/models/RoleGroup.js +15 -0
  29. package/dist/cjs/models/RoleGroup.js.map +1 -0
  30. package/dist/cjs/models/Team.js +2 -0
  31. package/dist/cjs/models/Team.js.map +1 -1
  32. package/dist/cjs/models/TeamMember.js +1 -0
  33. package/dist/cjs/models/TeamMember.js.map +1 -1
  34. package/dist/cjs/models/TrainingType.js +20 -0
  35. package/dist/cjs/models/TrainingType.js.map +1 -0
  36. package/dist/cjs/models/User.js +1 -6
  37. package/dist/cjs/models/User.js.map +1 -1
  38. package/dist/cjs/rpc/SyncRpcs.js +13 -0
  39. package/dist/cjs/rpc/SyncRpcs.js.map +1 -0
  40. package/dist/cjs/rpc/channel/ChannelRpcEvents.js +44 -0
  41. package/dist/cjs/rpc/channel/ChannelRpcEvents.js.map +1 -0
  42. package/dist/cjs/rpc/channel/ChannelRpcGroup.js +45 -0
  43. package/dist/cjs/rpc/channel/ChannelRpcGroup.js.map +1 -0
  44. package/dist/cjs/rpc/channel/ChannelRpcModels.js +17 -0
  45. package/dist/cjs/rpc/channel/ChannelRpcModels.js.map +1 -0
  46. package/dist/cjs/rpc/guild/GuildRpcGroup.js +35 -0
  47. package/dist/cjs/rpc/guild/GuildRpcGroup.js.map +1 -0
  48. package/dist/cjs/rpc/role/RoleRpcEvents.js +44 -0
  49. package/dist/cjs/rpc/role/RoleRpcEvents.js.map +1 -0
  50. package/dist/cjs/rpc/role/RoleRpcGroup.js +44 -0
  51. package/dist/cjs/rpc/role/RoleRpcGroup.js.map +1 -0
  52. package/dist/cjs/rpc/role/RoleRpcModels.js +16 -0
  53. package/dist/cjs/rpc/role/RoleRpcModels.js.map +1 -0
  54. package/dist/dts/api/AgeThresholdApi.d.ts +43 -43
  55. package/dist/dts/api/AgeThresholdApi.d.ts.map +1 -1
  56. package/dist/dts/api/Auth.d.ts +33 -44
  57. package/dist/dts/api/Auth.d.ts.map +1 -1
  58. package/dist/dts/api/GroupApi.d.ts +254 -0
  59. package/dist/dts/api/GroupApi.d.ts.map +1 -0
  60. package/dist/dts/api/NotificationApi.d.ts +9 -5
  61. package/dist/dts/api/NotificationApi.d.ts.map +1 -1
  62. package/dist/dts/api/RoleApi.d.ts +10 -10
  63. package/dist/dts/api/Roster.d.ts +7 -23
  64. package/dist/dts/api/Roster.d.ts.map +1 -1
  65. package/dist/dts/api/TrainingTypeApi.d.ts +116 -0
  66. package/dist/dts/api/TrainingTypeApi.d.ts.map +1 -0
  67. package/dist/dts/index.d.ts +16 -3
  68. package/dist/dts/index.d.ts.map +1 -1
  69. package/dist/dts/models/AgeThresholdRule.d.ts +13 -13
  70. package/dist/dts/models/ChannelSyncEvent.d.ts +164 -0
  71. package/dist/dts/models/ChannelSyncEvent.d.ts.map +1 -0
  72. package/dist/dts/models/Discord.d.ts +4 -0
  73. package/dist/dts/models/Discord.d.ts.map +1 -0
  74. package/dist/dts/models/DiscordChannelMapping.d.ts +97 -0
  75. package/dist/dts/models/DiscordChannelMapping.d.ts.map +1 -0
  76. package/dist/dts/models/GroupModel.d.ts +97 -0
  77. package/dist/dts/models/GroupModel.d.ts.map +1 -0
  78. package/dist/dts/models/Notification.d.ts +12 -12
  79. package/dist/dts/models/Notification.d.ts.map +1 -1
  80. package/dist/dts/models/Role.d.ts +4 -4
  81. package/dist/dts/models/Role.d.ts.map +1 -1
  82. package/dist/dts/models/RoleGroup.d.ts +16 -0
  83. package/dist/dts/models/RoleGroup.d.ts.map +1 -0
  84. package/dist/dts/models/RoleSyncEvent.d.ts +8 -8
  85. package/dist/dts/models/Team.d.ts +13 -0
  86. package/dist/dts/models/Team.d.ts.map +1 -1
  87. package/dist/dts/models/TeamMember.d.ts +30 -0
  88. package/dist/dts/models/TeamMember.d.ts.map +1 -1
  89. package/dist/dts/models/{SubgroupModel.d.ts → TrainingType.d.ts} +26 -13
  90. package/dist/dts/models/TrainingType.d.ts.map +1 -0
  91. package/dist/dts/models/User.d.ts +0 -43
  92. package/dist/dts/models/User.d.ts.map +1 -1
  93. package/dist/dts/rpc/SyncRpcs.d.ts +56 -0
  94. package/dist/dts/rpc/SyncRpcs.d.ts.map +1 -0
  95. package/dist/dts/rpc/channel/ChannelRpcEvents.d.ts +51 -0
  96. package/dist/dts/rpc/channel/ChannelRpcEvents.d.ts.map +1 -0
  97. package/dist/dts/rpc/channel/ChannelRpcGroup.d.ts +23 -0
  98. package/dist/dts/rpc/channel/ChannelRpcGroup.d.ts.map +1 -0
  99. package/dist/dts/rpc/channel/ChannelRpcModels.d.ts +28 -0
  100. package/dist/dts/rpc/channel/ChannelRpcModels.d.ts.map +1 -0
  101. package/dist/dts/rpc/guild/GuildRpcGroup.d.ts +19 -0
  102. package/dist/dts/rpc/guild/GuildRpcGroup.d.ts.map +1 -0
  103. package/dist/dts/rpc/role/RoleRpcEvents.d.ts +51 -0
  104. package/dist/dts/rpc/role/RoleRpcEvents.d.ts.map +1 -0
  105. package/dist/dts/rpc/role/RoleRpcGroup.d.ts +22 -0
  106. package/dist/dts/rpc/role/RoleRpcGroup.d.ts.map +1 -0
  107. package/dist/dts/rpc/role/RoleRpcModels.d.ts +24 -0
  108. package/dist/dts/rpc/role/RoleRpcModels.d.ts.map +1 -0
  109. package/dist/esm/api/AgeThresholdApi.js +17 -17
  110. package/dist/esm/api/AgeThresholdApi.js.map +1 -1
  111. package/dist/esm/api/Auth.js +15 -15
  112. package/dist/esm/api/Auth.js.map +1 -1
  113. package/dist/esm/api/GroupApi.js +185 -0
  114. package/dist/esm/api/GroupApi.js.map +1 -0
  115. package/dist/esm/api/NotificationApi.js +6 -2
  116. package/dist/esm/api/NotificationApi.js.map +1 -1
  117. package/dist/esm/api/Roster.js +2 -6
  118. package/dist/esm/api/Roster.js.map +1 -1
  119. package/dist/esm/api/TrainingTypeApi.js +70 -0
  120. package/dist/esm/api/TrainingTypeApi.js.map +1 -0
  121. package/dist/esm/index.js +16 -3
  122. package/dist/esm/index.js.map +1 -1
  123. package/dist/esm/models/AgeThresholdRule.js +2 -2
  124. package/dist/esm/models/AgeThresholdRule.js.map +1 -1
  125. package/dist/esm/models/ChannelSyncEvent.js +21 -0
  126. package/dist/esm/models/ChannelSyncEvent.js.map +1 -0
  127. package/dist/esm/models/Discord.js +3 -0
  128. package/dist/esm/models/Discord.js.map +1 -0
  129. package/dist/esm/models/DiscordChannelMapping.js +14 -0
  130. package/dist/esm/models/DiscordChannelMapping.js.map +1 -0
  131. package/dist/esm/models/GroupModel.js +13 -0
  132. package/dist/esm/models/GroupModel.js.map +1 -0
  133. package/dist/esm/models/Notification.js +1 -1
  134. package/dist/esm/models/Notification.js.map +1 -1
  135. package/dist/esm/models/Role.js +2 -2
  136. package/dist/esm/models/Role.js.map +1 -1
  137. package/dist/esm/models/RoleGroup.js +8 -0
  138. package/dist/esm/models/RoleGroup.js.map +1 -0
  139. package/dist/esm/models/Team.js +2 -0
  140. package/dist/esm/models/Team.js.map +1 -1
  141. package/dist/esm/models/TeamMember.js +1 -0
  142. package/dist/esm/models/TeamMember.js.map +1 -1
  143. package/dist/esm/models/TrainingType.js +13 -0
  144. package/dist/esm/models/TrainingType.js.map +1 -0
  145. package/dist/esm/models/User.js +0 -5
  146. package/dist/esm/models/User.js.map +1 -1
  147. package/dist/esm/rpc/SyncRpcs.js +6 -0
  148. package/dist/esm/rpc/SyncRpcs.js.map +1 -0
  149. package/dist/esm/rpc/channel/ChannelRpcEvents.js +34 -0
  150. package/dist/esm/rpc/channel/ChannelRpcEvents.js.map +1 -0
  151. package/dist/esm/rpc/channel/ChannelRpcGroup.js +39 -0
  152. package/dist/esm/rpc/channel/ChannelRpcGroup.js.map +1 -0
  153. package/dist/esm/rpc/channel/ChannelRpcModels.js +10 -0
  154. package/dist/esm/rpc/channel/ChannelRpcModels.js.map +1 -0
  155. package/dist/esm/rpc/guild/GuildRpcGroup.js +29 -0
  156. package/dist/esm/rpc/guild/GuildRpcGroup.js.map +1 -0
  157. package/dist/esm/rpc/role/RoleRpcEvents.js +34 -0
  158. package/dist/esm/rpc/role/RoleRpcEvents.js.map +1 -0
  159. package/dist/esm/rpc/role/RoleRpcGroup.js +38 -0
  160. package/dist/esm/rpc/role/RoleRpcGroup.js.map +1 -0
  161. package/dist/esm/rpc/role/RoleRpcModels.js +9 -0
  162. package/dist/esm/rpc/role/RoleRpcModels.js.map +1 -0
  163. package/package.json +1 -1
  164. package/src/api/AgeThresholdApi.ts +18 -18
  165. package/src/api/Auth.ts +17 -12
  166. package/src/api/GroupApi.ts +229 -0
  167. package/src/api/NotificationApi.ts +10 -0
  168. package/src/api/Roster.ts +1 -5
  169. package/src/api/TrainingTypeApi.ts +96 -0
  170. package/src/index.ts +23 -5
  171. package/src/models/AgeThresholdRule.ts +2 -2
  172. package/src/models/ChannelSyncEvent.ts +30 -0
  173. package/src/models/Discord.ts +4 -0
  174. package/src/models/DiscordChannelMapping.ts +18 -0
  175. package/src/models/GroupModel.ts +15 -0
  176. package/src/models/Notification.ts +2 -2
  177. package/src/models/Role.ts +4 -0
  178. package/src/models/RoleGroup.ts +8 -0
  179. package/src/models/Team.ts +2 -0
  180. package/src/models/TeamMember.ts +1 -0
  181. package/src/models/TrainingType.ts +15 -0
  182. package/src/models/User.ts +0 -9
  183. package/src/rpc/SyncRpcs.ts +6 -0
  184. package/src/rpc/channel/ChannelRpcEvents.ts +57 -0
  185. package/src/rpc/channel/ChannelRpcGroup.ts +33 -0
  186. package/src/rpc/channel/ChannelRpcModels.ts +10 -0
  187. package/src/rpc/guild/GuildRpcGroup.ts +29 -0
  188. package/src/rpc/role/RoleRpcEvents.ts +48 -0
  189. package/src/rpc/role/RoleRpcGroup.ts +33 -0
  190. package/src/rpc/role/RoleRpcModels.ts +9 -0
  191. package/dist/cjs/api/SubgroupApi.js +0 -122
  192. package/dist/cjs/api/SubgroupApi.js.map +0 -1
  193. package/dist/cjs/models/SubgroupModel.js +0 -18
  194. package/dist/cjs/models/SubgroupModel.js.map +0 -1
  195. package/dist/cjs/rpc/RoleSyncRpc.js +0 -66
  196. package/dist/cjs/rpc/RoleSyncRpc.js.map +0 -1
  197. package/dist/dts/api/SubgroupApi.d.ts +0 -140
  198. package/dist/dts/api/SubgroupApi.d.ts.map +0 -1
  199. package/dist/dts/models/SubgroupModel.d.ts.map +0 -1
  200. package/dist/dts/rpc/RoleSyncRpc.d.ts +0 -82
  201. package/dist/dts/rpc/RoleSyncRpc.d.ts.map +0 -1
  202. package/dist/esm/api/SubgroupApi.js +0 -106
  203. package/dist/esm/api/SubgroupApi.js.map +0 -1
  204. package/dist/esm/models/SubgroupModel.js +0 -11
  205. package/dist/esm/models/SubgroupModel.js.map +0 -1
  206. package/dist/esm/rpc/RoleSyncRpc.js +0 -57
  207. package/dist/esm/rpc/RoleSyncRpc.js.map +0 -1
  208. package/src/api/SubgroupApi.ts +0 -146
  209. package/src/models/SubgroupModel.ts +0 -13
  210. package/src/rpc/RoleSyncRpc.ts +0 -59
package/src/api/Auth.ts CHANGED
@@ -6,9 +6,10 @@ 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
- import { Gender, Locale, Position, Proficiency, UserId } from '~/models/User.js';
12
+ import { Gender, Locale, UserId } from '~/models/User.js';
12
13
 
13
14
  export { UserId } from '~/models/User.js';
14
15
 
@@ -30,9 +31,6 @@ export class CurrentUser extends Schema.Class<CurrentUser>('CurrentUser')({
30
31
  name: Schema.NullOr(Schema.String),
31
32
  birthYear: Schema.NullOr(Schema.Number),
32
33
  gender: Schema.NullOr(Gender),
33
- jerseyNumber: Schema.NullOr(Schema.Number),
34
- position: Schema.NullOr(Position),
35
- proficiency: Schema.NullOr(Proficiency),
36
34
  locale: Locale,
37
35
  }) {}
38
36
 
@@ -42,6 +40,15 @@ export class UpdateLocaleRequest extends Schema.Class<UpdateLocaleRequest>('Upda
42
40
 
43
41
  export class CreateTeamRequest extends Schema.Class<CreateTeamRequest>('CreateTeamRequest')({
44
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,
45
52
  }) {}
46
53
 
47
54
  export class CompleteProfileRequest extends Schema.Class<CompleteProfileRequest>(
@@ -56,11 +63,6 @@ export class CompleteProfileRequest extends Schema.Class<CompleteProfileRequest>
56
63
  }),
57
64
  ),
58
65
  gender: Gender,
59
- jerseyNumber: Schema.optionalWith(Schema.Number.pipe(Schema.int(), Schema.between(0, 99)), {
60
- as: 'Option',
61
- }),
62
- position: Position,
63
- proficiency: Proficiency,
64
66
  }) {}
65
67
 
66
68
  export class UpdateProfileRequest extends Schema.Class<UpdateProfileRequest>(
@@ -77,9 +79,6 @@ export class UpdateProfileRequest extends Schema.Class<UpdateProfileRequest>(
77
79
  ),
78
80
  ),
79
81
  gender: Schema.NullOr(Gender),
80
- jerseyNumber: Schema.NullOr(Schema.Number.pipe(Schema.int(), Schema.between(0, 99))),
81
- position: Schema.NullOr(Position),
82
- proficiency: Schema.NullOr(Proficiency),
83
82
  }) {}
84
83
 
85
84
  export class Unauthorized extends Schema.TaggedError<Unauthorized>()(
@@ -146,6 +145,12 @@ export class AuthApiGroup extends HttpApiGroup.make('auth')
146
145
  .addError(Unauthorized, { status: 401 })
147
146
  .middleware(AuthMiddleware),
148
147
  )
148
+ .add(
149
+ HttpApiEndpoint.get('myGuilds', '/me/guilds')
150
+ .addSuccess(Schema.Array(DiscordGuild))
151
+ .addError(Unauthorized, { status: 401 })
152
+ .middleware(AuthMiddleware),
153
+ )
149
154
  .add(
150
155
  HttpApiEndpoint.post('createTeam', '/me/teams')
151
156
  .addSuccess(UserTeam)
@@ -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
@@ -5,7 +5,7 @@ import { Permission } from '~/models/Role.js';
5
5
  import { RosterId } from '~/models/RosterModel.js';
6
6
  import { TeamId } from '~/models/Team.js';
7
7
  import { TeamMemberId } from '~/models/TeamMember.js';
8
- import { Gender, Position, Proficiency, UserId } from '~/models/User.js';
8
+ import { Gender, UserId } from '~/models/User.js';
9
9
 
10
10
  export class RosterPlayer extends Schema.Class<RosterPlayer>('RosterPlayer')({
11
11
  memberId: TeamMemberId,
@@ -16,8 +16,6 @@ export class RosterPlayer extends Schema.Class<RosterPlayer>('RosterPlayer')({
16
16
  birthYear: Schema.NullOr(Schema.Number),
17
17
  gender: Schema.NullOr(Gender),
18
18
  jerseyNumber: Schema.NullOr(Schema.Number),
19
- position: Schema.NullOr(Position),
20
- proficiency: Schema.NullOr(Proficiency),
21
19
  discordUsername: Schema.String,
22
20
  discordAvatar: Schema.NullOr(Schema.String),
23
21
  }) {}
@@ -27,8 +25,6 @@ export class UpdatePlayerRequest extends Schema.Class<UpdatePlayerRequest>('Upda
27
25
  birthYear: Schema.NullOr(Schema.Number),
28
26
  gender: Schema.NullOr(Gender),
29
27
  jerseyNumber: Schema.NullOr(Schema.Number),
30
- position: Schema.NullOr(Position),
31
- proficiency: Schema.NullOr(Proficiency),
32
28
  }) {}
33
29
 
34
30
  export class PlayerNotFound extends Schema.TaggedError<PlayerNotFound>()(
@@ -0,0 +1,96 @@
1
+ import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from '@effect/platform';
2
+ import { Schema } from 'effect';
3
+ import { AuthMiddleware } from '~/api/Auth.js';
4
+ import { GroupId } from '~/models/GroupModel.js';
5
+ import { TeamId } from '~/models/Team.js';
6
+ import { TrainingTypeId } from '~/models/TrainingType.js';
7
+
8
+ export class TrainingTypeInfo extends Schema.Class<TrainingTypeInfo>('TrainingTypeInfo')({
9
+ trainingTypeId: TrainingTypeId,
10
+ teamId: TeamId,
11
+ name: Schema.String,
12
+ groupName: Schema.NullOr(Schema.String),
13
+ }) {}
14
+
15
+ export class TrainingTypeDetail extends Schema.Class<TrainingTypeDetail>('TrainingTypeDetail')({
16
+ trainingTypeId: TrainingTypeId,
17
+ teamId: TeamId,
18
+ name: Schema.String,
19
+ groupId: Schema.NullOr(GroupId),
20
+ groupName: Schema.NullOr(Schema.String),
21
+ canAdmin: Schema.Boolean,
22
+ }) {}
23
+
24
+ export class TrainingTypeListResponse extends Schema.Class<TrainingTypeListResponse>(
25
+ 'TrainingTypeListResponse',
26
+ )({
27
+ canAdmin: Schema.Boolean,
28
+ trainingTypes: Schema.Array(TrainingTypeInfo),
29
+ }) {}
30
+
31
+ export class CreateTrainingTypeRequest extends Schema.Class<CreateTrainingTypeRequest>(
32
+ 'CreateTrainingTypeRequest',
33
+ )({
34
+ name: Schema.NonEmptyString,
35
+ groupId: Schema.NullOr(GroupId),
36
+ }) {}
37
+
38
+ export class UpdateTrainingTypeRequest extends Schema.Class<UpdateTrainingTypeRequest>(
39
+ 'UpdateTrainingTypeRequest',
40
+ )({
41
+ name: Schema.NonEmptyString,
42
+ }) {}
43
+
44
+ export class TrainingTypeNotFound extends Schema.TaggedError<TrainingTypeNotFound>()(
45
+ 'TrainingTypeNotFound',
46
+ {},
47
+ HttpApiSchema.annotations({ status: 404 }),
48
+ ) {}
49
+
50
+ export class Forbidden extends Schema.TaggedError<Forbidden>()(
51
+ 'TrainingTypeForbidden',
52
+ {},
53
+ HttpApiSchema.annotations({ status: 403 }),
54
+ ) {}
55
+
56
+ export class TrainingTypeApiGroup extends HttpApiGroup.make('trainingType')
57
+ .add(
58
+ HttpApiEndpoint.get('listTrainingTypes', '/teams/:teamId/training-types')
59
+ .addSuccess(TrainingTypeListResponse)
60
+ .addError(Forbidden, { status: 403 })
61
+ .setPath(Schema.Struct({ teamId: TeamId }))
62
+ .middleware(AuthMiddleware),
63
+ )
64
+ .add(
65
+ HttpApiEndpoint.post('createTrainingType', '/teams/:teamId/training-types')
66
+ .addSuccess(TrainingTypeInfo, { status: 201 })
67
+ .addError(Forbidden, { status: 403 })
68
+ .setPath(Schema.Struct({ teamId: TeamId }))
69
+ .setPayload(CreateTrainingTypeRequest)
70
+ .middleware(AuthMiddleware),
71
+ )
72
+ .add(
73
+ HttpApiEndpoint.get('getTrainingType', '/teams/:teamId/training-types/:trainingTypeId')
74
+ .addSuccess(TrainingTypeDetail)
75
+ .addError(Forbidden, { status: 403 })
76
+ .addError(TrainingTypeNotFound, { status: 404 })
77
+ .setPath(Schema.Struct({ teamId: TeamId, trainingTypeId: TrainingTypeId }))
78
+ .middleware(AuthMiddleware),
79
+ )
80
+ .add(
81
+ HttpApiEndpoint.patch('updateTrainingType', '/teams/:teamId/training-types/:trainingTypeId')
82
+ .addSuccess(TrainingTypeInfo)
83
+ .addError(Forbidden, { status: 403 })
84
+ .addError(TrainingTypeNotFound, { status: 404 })
85
+ .setPath(Schema.Struct({ teamId: TeamId, trainingTypeId: TrainingTypeId }))
86
+ .setPayload(UpdateTrainingTypeRequest)
87
+ .middleware(AuthMiddleware),
88
+ )
89
+ .add(
90
+ HttpApiEndpoint.del('deleteTrainingType', '/teams/:teamId/training-types/:trainingTypeId')
91
+ .addSuccess(Schema.Void)
92
+ .addError(Forbidden, { status: 403 })
93
+ .addError(TrainingTypeNotFound, { status: 404 })
94
+ .setPath(Schema.Struct({ teamId: TeamId, trainingTypeId: TrainingTypeId }))
95
+ .middleware(AuthMiddleware),
96
+ ) {}
package/src/index.ts CHANGED
@@ -4,6 +4,8 @@ export * as AgeThresholdApi from './api/AgeThresholdApi.js';
4
4
 
5
5
  export * as Auth from './api/Auth.js';
6
6
 
7
+ export * as GroupApi from './api/GroupApi.js';
8
+
7
9
  export * as Invite from './api/Invite.js';
8
10
 
9
11
  export * as NotificationApi from './api/NotificationApi.js';
@@ -12,18 +14,28 @@ export * as RoleApi from './api/RoleApi.js';
12
14
 
13
15
  export * as Roster from './api/Roster.js';
14
16
 
15
- export * as SubgroupApi from './api/SubgroupApi.js';
17
+ export * as TrainingTypeApi from './api/TrainingTypeApi.js';
16
18
 
17
19
  export * as AgeThresholdRule from './models/AgeThresholdRule.js';
18
20
 
21
+ export * as ChannelSyncEvent from './models/ChannelSyncEvent.js';
22
+
23
+ export * as Discord from './models/Discord.js';
24
+
25
+ export * as DiscordChannelMapping from './models/DiscordChannelMapping.js';
26
+
19
27
  export * as DiscordRoleMapping from './models/DiscordRoleMapping.js';
20
28
 
29
+ export * as GroupModel from './models/GroupModel.js';
30
+
21
31
  export * as MemberRole from './models/MemberRole.js';
22
32
 
23
33
  export * as Notification from './models/Notification.js';
24
34
 
25
35
  export * as Role from './models/Role.js';
26
36
 
37
+ export * as RoleGroup from './models/RoleGroup.js';
38
+
27
39
  export * as RoleSyncEvent from './models/RoleSyncEvent.js';
28
40
 
29
41
  export * as RosterMemberModel from './models/RosterMemberModel.js';
@@ -32,14 +44,20 @@ export * as RosterModel from './models/RosterModel.js';
32
44
 
33
45
  export * as Session from './models/Session.js';
34
46
 
35
- export * as SubgroupModel from './models/SubgroupModel.js';
36
-
37
47
  export * as Team from './models/Team.js';
38
48
 
39
49
  export * as TeamInvite from './models/TeamInvite.js';
40
50
 
41
51
  export * as TeamMember from './models/TeamMember.js';
42
52
 
43
- export * as User from './models/User.js';
53
+ export * as TrainingType from './models/TrainingType.js';
44
54
 
45
- export * as RoleSyncRpc from './rpc/RoleSyncRpc.js';
55
+ export * as User from './models/User.js';
56
+ export * as ChannelRpcEvents from './rpc/channel/ChannelRpcEvents.js';
57
+ export * as ChannelRpcGroup from './rpc/channel/ChannelRpcGroup.js';
58
+ export * as ChannelRpcModels from './rpc/channel/ChannelRpcModels.js';
59
+ export * as GuildRpcGroup from './rpc/guild/GuildRpcGroup.js';
60
+ export * as RoleRpcEvents from './rpc/role/RoleRpcEvents.js';
61
+ export * as RoleRpcGroup from './rpc/role/RoleRpcGroup.js';
62
+ export * as RoleRpcModels from './rpc/role/RoleRpcModels.js';
63
+ export * as SyncRpcs from './rpc/SyncRpcs.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,
@@ -0,0 +1,30 @@
1
+ import { Model } from '@effect/sql';
2
+ import { Schema } from 'effect';
3
+ import { GroupId } from '~/models/GroupModel.js';
4
+ import { TeamId } from '~/models/Team.js';
5
+ import { TeamMemberId } from '~/models/TeamMember.js';
6
+
7
+ export const ChannelSyncEventId = Schema.String.pipe(Schema.brand('ChannelSyncEventId'));
8
+ export type ChannelSyncEventId = typeof ChannelSyncEventId.Type;
9
+
10
+ export const ChannelSyncEventType = Schema.Literal(
11
+ 'channel_created',
12
+ 'channel_deleted',
13
+ 'member_added',
14
+ 'member_removed',
15
+ );
16
+ export type ChannelSyncEventType = typeof ChannelSyncEventType.Type;
17
+
18
+ export class ChannelSyncEvent extends Model.Class<ChannelSyncEvent>('ChannelSyncEvent')({
19
+ id: Model.Generated(ChannelSyncEventId),
20
+ team_id: TeamId,
21
+ guild_id: Schema.String,
22
+ event_type: ChannelSyncEventType,
23
+ group_id: GroupId,
24
+ group_name: Schema.NullOr(Schema.String),
25
+ team_member_id: Schema.NullOr(TeamMemberId),
26
+ discord_user_id: Schema.NullOr(Schema.String),
27
+ processed_at: Schema.NullOr(Schema.String),
28
+ error: Schema.NullOr(Schema.String),
29
+ created_at: Model.DateTimeInsertFromDate,
30
+ }) {}
@@ -0,0 +1,4 @@
1
+ import { Schema } from 'effect';
2
+
3
+ export const Snowflake = Schema.String.pipe(Schema.brand('Snowflake'));
4
+ export type Snowflake = typeof Snowflake.Type;
@@ -0,0 +1,18 @@
1
+ import { Model } from '@effect/sql';
2
+ import { Schema } from 'effect';
3
+ import { GroupId } from '~/models/GroupModel.js';
4
+ import { TeamId } from '~/models/Team.js';
5
+
6
+ export const DiscordChannelMappingId = Schema.String.pipe(Schema.brand('DiscordChannelMappingId'));
7
+ export type DiscordChannelMappingId = typeof DiscordChannelMappingId.Type;
8
+
9
+ export class DiscordChannelMapping extends Model.Class<DiscordChannelMapping>(
10
+ 'DiscordChannelMapping',
11
+ )({
12
+ id: Model.Generated(DiscordChannelMappingId),
13
+ team_id: TeamId,
14
+ group_id: GroupId,
15
+ discord_channel_id: Schema.String,
16
+ discord_role_id: Schema.OptionFromNullOr(Schema.String),
17
+ created_at: Model.DateTimeInsertFromDate,
18
+ }) {}
@@ -0,0 +1,15 @@
1
+ import { Model } from '@effect/sql';
2
+ import { Schema } from 'effect';
3
+ import { TeamId } from '~/models/Team.js';
4
+
5
+ export const GroupId = Schema.String.pipe(Schema.brand('GroupId'));
6
+ export type GroupId = typeof GroupId.Type;
7
+
8
+ export class Group extends Model.Class<Group>('Group')({
9
+ id: Model.Generated(GroupId),
10
+ team_id: TeamId,
11
+ parent_id: Schema.NullOr(GroupId),
12
+ name: Schema.String,
13
+ emoji: Schema.NullOr(Schema.String),
14
+ created_at: Model.DateTimeInsertFromDate,
15
+ }) {}
@@ -7,8 +7,8 @@ export const NotificationId = Schema.String.pipe(Schema.brand('NotificationId'))
7
7
  export type NotificationId = typeof NotificationId.Type;
8
8
 
9
9
  export const NotificationType = Schema.Literal(
10
- 'age_role_assigned',
11
- 'age_role_removed',
10
+ 'age_group_added',
11
+ 'age_group_removed',
12
12
  'role_assigned',
13
13
  'role_removed',
14
14
  );
@@ -15,6 +15,8 @@ export const Permission = Schema.Literal(
15
15
  'member:remove',
16
16
  'role:view',
17
17
  'role:manage',
18
+ 'training-type:create',
19
+ 'training-type:delete',
18
20
  );
19
21
  export type Permission = typeof Permission.Type;
20
22
 
@@ -32,6 +34,8 @@ export const defaultPermissions: Record<string, ReadonlyArray<Permission>> = {
32
34
  'member:remove',
33
35
  'role:view',
34
36
  'role:manage',
37
+ 'training-type:create',
38
+ 'training-type:delete',
35
39
  ],
36
40
  Captain: ['roster:view', 'roster:manage', 'member:view', 'member:edit', 'role:view'],
37
41
  Player: ['roster:view', 'member:view'],
@@ -0,0 +1,8 @@
1
+ import { Schema } from 'effect';
2
+ import { GroupId } from '~/models/GroupModel.js';
3
+ import { RoleId } from '~/models/Role.js';
4
+
5
+ export class RoleGroup extends Schema.Class<RoleGroup>('RoleGroup')({
6
+ role_id: RoleId,
7
+ group_id: GroupId,
8
+ }) {}
@@ -1,5 +1,6 @@
1
1
  import { Model } from '@effect/sql';
2
2
  import { Schema } from 'effect';
3
+ import { Snowflake } from '~/models/Discord.js';
3
4
  import { UserId } from '~/models/User.js';
4
5
 
5
6
  export const TeamId = Schema.String.pipe(Schema.brand('TeamId'));
@@ -8,6 +9,7 @@ export type TeamId = typeof TeamId.Type;
8
9
  export class Team extends Model.Class<Team>('Team')({
9
10
  id: Model.Generated(TeamId),
10
11
  name: Schema.String,
12
+ guild_id: Snowflake,
11
13
  created_by: UserId,
12
14
  created_at: Model.DateTimeInsertFromDate,
13
15
  updated_at: Model.DateTimeUpdateFromDate,
@@ -11,5 +11,6 @@ export class TeamMember extends Model.Class<TeamMember>('TeamMember')({
11
11
  team_id: TeamId,
12
12
  user_id: UserId,
13
13
  active: Schema.Boolean,
14
+ jersey_number: Model.FieldExcept('insert')(Schema.NullOr(Schema.Number)),
14
15
  joined_at: Model.DateTimeInsertFromDate,
15
16
  }) {}