@sideline/domain 0.3.0 → 0.4.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 (133) hide show
  1. package/dist/cjs/api/AgeThresholdApi.js +6 -6
  2. package/dist/cjs/api/AgeThresholdApi.js.map +1 -1
  3. package/dist/cjs/api/Auth.js +2 -13
  4. package/dist/cjs/api/Auth.js.map +1 -1
  5. package/dist/cjs/api/Roster.js +1 -5
  6. package/dist/cjs/api/Roster.js.map +1 -1
  7. package/dist/cjs/api/TrainingTypeApi.js +115 -0
  8. package/dist/cjs/api/TrainingTypeApi.js.map +1 -0
  9. package/dist/cjs/index.js +25 -3
  10. package/dist/cjs/models/ChannelSyncEvent.js +28 -0
  11. package/dist/cjs/models/ChannelSyncEvent.js.map +1 -0
  12. package/dist/cjs/models/Discord.js +9 -0
  13. package/dist/cjs/models/Discord.js.map +1 -0
  14. package/dist/cjs/models/DiscordChannelMapping.js +21 -0
  15. package/dist/cjs/models/DiscordChannelMapping.js.map +1 -0
  16. package/dist/cjs/models/TeamMember.js +1 -0
  17. package/dist/cjs/models/TeamMember.js.map +1 -1
  18. package/dist/cjs/models/TrainingType.js +18 -0
  19. package/dist/cjs/models/TrainingType.js.map +1 -0
  20. package/dist/cjs/models/User.js +1 -6
  21. package/dist/cjs/models/User.js.map +1 -1
  22. package/dist/cjs/rpc/SyncRpcs.js +12 -0
  23. package/dist/cjs/rpc/SyncRpcs.js.map +1 -0
  24. package/dist/cjs/rpc/channel/ChannelRpcEvents.js +44 -0
  25. package/dist/cjs/rpc/channel/ChannelRpcEvents.js.map +1 -0
  26. package/dist/cjs/rpc/channel/ChannelRpcGroup.js +45 -0
  27. package/dist/cjs/rpc/channel/ChannelRpcGroup.js.map +1 -0
  28. package/dist/cjs/rpc/channel/ChannelRpcModels.js +17 -0
  29. package/dist/cjs/rpc/channel/ChannelRpcModels.js.map +1 -0
  30. package/dist/cjs/rpc/role/RoleRpcEvents.js +44 -0
  31. package/dist/cjs/rpc/role/RoleRpcEvents.js.map +1 -0
  32. package/dist/cjs/rpc/role/RoleRpcGroup.js +44 -0
  33. package/dist/cjs/rpc/role/RoleRpcGroup.js.map +1 -0
  34. package/dist/cjs/rpc/role/RoleRpcModels.js +16 -0
  35. package/dist/cjs/rpc/role/RoleRpcModels.js.map +1 -0
  36. package/dist/dts/api/AgeThresholdApi.d.ts +18 -18
  37. package/dist/dts/api/Auth.d.ts +0 -40
  38. package/dist/dts/api/Auth.d.ts.map +1 -1
  39. package/dist/dts/api/Roster.d.ts +2 -18
  40. package/dist/dts/api/Roster.d.ts.map +1 -1
  41. package/dist/dts/api/TrainingTypeApi.d.ts +141 -0
  42. package/dist/dts/api/TrainingTypeApi.d.ts.map +1 -0
  43. package/dist/dts/index.d.ts +12 -1
  44. package/dist/dts/index.d.ts.map +1 -1
  45. package/dist/dts/models/ChannelSyncEvent.d.ts +164 -0
  46. package/dist/dts/models/ChannelSyncEvent.d.ts.map +1 -0
  47. package/dist/dts/models/Discord.d.ts +4 -0
  48. package/dist/dts/models/Discord.d.ts.map +1 -0
  49. package/dist/dts/models/DiscordChannelMapping.d.ts +97 -0
  50. package/dist/dts/models/DiscordChannelMapping.d.ts.map +1 -0
  51. package/dist/dts/models/RoleSyncEvent.d.ts +4 -4
  52. package/dist/dts/models/TeamMember.d.ts +30 -0
  53. package/dist/dts/models/TeamMember.d.ts.map +1 -1
  54. package/dist/dts/models/TrainingType.d.ts +71 -0
  55. package/dist/dts/models/TrainingType.d.ts.map +1 -0
  56. package/dist/dts/models/User.d.ts +0 -43
  57. package/dist/dts/models/User.d.ts.map +1 -1
  58. package/dist/dts/rpc/SyncRpcs.d.ts +41 -0
  59. package/dist/dts/rpc/SyncRpcs.d.ts.map +1 -0
  60. package/dist/dts/rpc/channel/ChannelRpcEvents.d.ts +51 -0
  61. package/dist/dts/rpc/channel/ChannelRpcEvents.d.ts.map +1 -0
  62. package/dist/dts/rpc/channel/ChannelRpcGroup.d.ts +23 -0
  63. package/dist/dts/rpc/channel/ChannelRpcGroup.d.ts.map +1 -0
  64. package/dist/dts/rpc/channel/ChannelRpcModels.d.ts +28 -0
  65. package/dist/dts/rpc/channel/ChannelRpcModels.d.ts.map +1 -0
  66. package/dist/dts/rpc/role/RoleRpcEvents.d.ts +51 -0
  67. package/dist/dts/rpc/role/RoleRpcEvents.d.ts.map +1 -0
  68. package/dist/dts/rpc/role/RoleRpcGroup.d.ts +22 -0
  69. package/dist/dts/rpc/role/RoleRpcGroup.d.ts.map +1 -0
  70. package/dist/dts/rpc/role/RoleRpcModels.d.ts +24 -0
  71. package/dist/dts/rpc/role/RoleRpcModels.d.ts.map +1 -0
  72. package/dist/esm/api/AgeThresholdApi.js +6 -6
  73. package/dist/esm/api/AgeThresholdApi.js.map +1 -1
  74. package/dist/esm/api/Auth.js +3 -14
  75. package/dist/esm/api/Auth.js.map +1 -1
  76. package/dist/esm/api/Roster.js +2 -6
  77. package/dist/esm/api/Roster.js.map +1 -1
  78. package/dist/esm/api/TrainingTypeApi.js +99 -0
  79. package/dist/esm/api/TrainingTypeApi.js.map +1 -0
  80. package/dist/esm/index.js +12 -1
  81. package/dist/esm/index.js.map +1 -1
  82. package/dist/esm/models/ChannelSyncEvent.js +21 -0
  83. package/dist/esm/models/ChannelSyncEvent.js.map +1 -0
  84. package/dist/esm/models/Discord.js +3 -0
  85. package/dist/esm/models/Discord.js.map +1 -0
  86. package/dist/esm/models/DiscordChannelMapping.js +14 -0
  87. package/dist/esm/models/DiscordChannelMapping.js.map +1 -0
  88. package/dist/esm/models/TeamMember.js +1 -0
  89. package/dist/esm/models/TeamMember.js.map +1 -1
  90. package/dist/esm/models/TrainingType.js +11 -0
  91. package/dist/esm/models/TrainingType.js.map +1 -0
  92. package/dist/esm/models/User.js +0 -5
  93. package/dist/esm/models/User.js.map +1 -1
  94. package/dist/esm/rpc/SyncRpcs.js +5 -0
  95. package/dist/esm/rpc/SyncRpcs.js.map +1 -0
  96. package/dist/esm/rpc/channel/ChannelRpcEvents.js +34 -0
  97. package/dist/esm/rpc/channel/ChannelRpcEvents.js.map +1 -0
  98. package/dist/esm/rpc/channel/ChannelRpcGroup.js +39 -0
  99. package/dist/esm/rpc/channel/ChannelRpcGroup.js.map +1 -0
  100. package/dist/esm/rpc/channel/ChannelRpcModels.js +10 -0
  101. package/dist/esm/rpc/channel/ChannelRpcModels.js.map +1 -0
  102. package/dist/esm/rpc/role/RoleRpcEvents.js +34 -0
  103. package/dist/esm/rpc/role/RoleRpcEvents.js.map +1 -0
  104. package/dist/esm/rpc/role/RoleRpcGroup.js +38 -0
  105. package/dist/esm/rpc/role/RoleRpcGroup.js.map +1 -0
  106. package/dist/esm/rpc/role/RoleRpcModels.js +9 -0
  107. package/dist/esm/rpc/role/RoleRpcModels.js.map +1 -0
  108. package/package.json +1 -1
  109. package/src/api/AgeThresholdApi.ts +6 -6
  110. package/src/api/Auth.ts +1 -12
  111. package/src/api/Roster.ts +1 -5
  112. package/src/api/TrainingTypeApi.ts +143 -0
  113. package/src/index.ts +17 -2
  114. package/src/models/ChannelSyncEvent.ts +30 -0
  115. package/src/models/Discord.ts +4 -0
  116. package/src/models/DiscordChannelMapping.ts +18 -0
  117. package/src/models/TeamMember.ts +1 -0
  118. package/src/models/TrainingType.ts +13 -0
  119. package/src/models/User.ts +0 -9
  120. package/src/rpc/SyncRpcs.ts +5 -0
  121. package/src/rpc/channel/ChannelRpcEvents.ts +57 -0
  122. package/src/rpc/channel/ChannelRpcGroup.ts +33 -0
  123. package/src/rpc/channel/ChannelRpcModels.ts +10 -0
  124. package/src/rpc/role/RoleRpcEvents.ts +48 -0
  125. package/src/rpc/role/RoleRpcGroup.ts +33 -0
  126. package/src/rpc/role/RoleRpcModels.ts +9 -0
  127. package/dist/cjs/rpc/RoleSyncRpc.js +0 -66
  128. package/dist/cjs/rpc/RoleSyncRpc.js.map +0 -1
  129. package/dist/dts/rpc/RoleSyncRpc.d.ts +0 -82
  130. package/dist/dts/rpc/RoleSyncRpc.d.ts.map +0 -1
  131. package/dist/esm/rpc/RoleSyncRpc.js +0 -57
  132. package/dist/esm/rpc/RoleSyncRpc.js.map +0 -1
  133. package/src/rpc/RoleSyncRpc.ts +0 -59
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoleRpcGroup.js","names":["Rpc","RpcGroup","Schema","Discord","Role","RoleSyncEvent","Team","UnprocessedRoleEvent","RoleMapping","RoleRpcGroup","make","payload","limit","Number","success","Array","id","RoleSyncEventId","error","String","team_id","TeamId","role_id","RoleId","OptionFromNullOr","discord_role_id","Snowflake","prefix"],"sources":["../../../../src/rpc/role/RoleRpcGroup.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,GAAG,EAAEC,QAAQ,QAAQ,aAAa;AAC3C,SAASC,MAAM,QAAQ,QAAQ;AAC/B,SAASC,OAAO,EAAEC,IAAI,EAAEC,aAAa,EAAEC,IAAI,QAAQ,gBAAa;AAChE,SAASC,oBAAoB,QAAQ,oBAAoB;AACzD,SAASC,WAAW,QAAQ,oBAAoB;AAEhD,OAAO,MAAMC,YAAY,gBAAGR,QAAQ,CAACS,IAAI,CACvCV,GAAG,CAACU,IAAI,CAAC,sBAAsB,EAAE;EAC/BC,OAAO,EAAE;IAAEC,KAAK,EAAEV,MAAM,CAACW;EAAM,CAAE;EACjCC,OAAO,EAAEZ,MAAM,CAACa,KAAK,CAACR,oBAAoB;CAC3C,CAAC,EACFP,GAAG,CAACU,IAAI,CAAC,oBAAoB,EAAE;EAC7BC,OAAO,EAAE;IAAEK,EAAE,EAAEX,aAAa,CAACY;EAAe;CAC7C,CAAC,EACFjB,GAAG,CAACU,IAAI,CAAC,iBAAiB,EAAE;EAC1BC,OAAO,EAAE;IAAEK,EAAE,EAAEX,aAAa,CAACY,eAAe;IAAEC,KAAK,EAAEhB,MAAM,CAACiB;EAAM;CACnE,CAAC,EACFnB,GAAG,CAACU,IAAI,CAAC,YAAY,EAAE;EACrBC,OAAO,EAAE;IAAES,OAAO,EAAEd,IAAI,CAACe,MAAM;IAAEC,OAAO,EAAElB,IAAI,CAACmB;EAAM,CAAE;EACvDT,OAAO,EAAEZ,MAAM,CAACsB,gBAAgB,CAAChB,WAAW;CAC7C,CAAC,EACFR,GAAG,CAACU,IAAI,CAAC,eAAe,EAAE;EACxBC,OAAO,EAAE;IACPS,OAAO,EAAEd,IAAI,CAACe,MAAM;IACpBC,OAAO,EAAElB,IAAI,CAACmB,MAAM;IACpBE,eAAe,EAAEtB,OAAO,CAACuB;;CAE5B,CAAC,EAEF1B,GAAG,CAACU,IAAI,CAAC,eAAe,EAAE;EACxBC,OAAO,EAAE;IAAES,OAAO,EAAEd,IAAI,CAACe,MAAM;IAAEC,OAAO,EAAElB,IAAI,CAACmB;EAAM;CACtD,CAAC,CACH,CAACI,MAAM,CAAC,OAAO,CAAC","ignoreList":[]}
@@ -0,0 +1,9 @@
1
+ import { Schema } from 'effect';
2
+ import { Discord, DiscordRoleMapping, Role, Team } from '../../index.js';
3
+ export class RoleMapping extends /*#__PURE__*/Schema.Class('RoleMapping')({
4
+ id: DiscordRoleMapping.DiscordRoleMappingId,
5
+ team_id: Team.TeamId,
6
+ role_id: Role.RoleId,
7
+ discord_role_id: Discord.Snowflake
8
+ }) {}
9
+ //# sourceMappingURL=RoleRpcModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoleRpcModels.js","names":["Schema","Discord","DiscordRoleMapping","Role","Team","RoleMapping","Class","id","DiscordRoleMappingId","team_id","TeamId","role_id","RoleId","discord_role_id","Snowflake"],"sources":["../../../../src/rpc/role/RoleRpcModels.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,MAAM,QAAQ,QAAQ;AAC/B,SAASC,OAAO,EAAEC,kBAAkB,EAAEC,IAAI,EAAEC,IAAI,QAAQ,gBAAa;AAErE,OAAM,MAAOC,WAAY,sBAAQL,MAAM,CAACM,KAAK,CAAc,aAAa,CAAC,CAAC;EACxEC,EAAE,EAAEL,kBAAkB,CAACM,oBAAoB;EAC3CC,OAAO,EAAEL,IAAI,CAACM,MAAM;EACpBC,OAAO,EAAER,IAAI,CAACS,MAAM;EACpBC,eAAe,EAAEZ,OAAO,CAACa;CAC1B,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sideline/domain",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "The domain template",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -11,8 +11,8 @@ export class AgeThresholdInfo extends Schema.Class<AgeThresholdInfo>('AgeThresho
11
11
  teamId: TeamId,
12
12
  roleId: RoleId,
13
13
  roleName: Schema.String,
14
- minAge: Schema.NullOr(Schema.Number),
15
- maxAge: Schema.NullOr(Schema.Number),
14
+ minAge: Schema.OptionFromNullOr(Schema.Number),
15
+ maxAge: Schema.OptionFromNullOr(Schema.Number),
16
16
  }) {}
17
17
 
18
18
  export class AgeRoleChange extends Schema.Class<AgeRoleChange>('AgeRoleChange')({
@@ -27,15 +27,15 @@ export class CreateAgeThresholdRequest extends Schema.Class<CreateAgeThresholdRe
27
27
  'CreateAgeThresholdRequest',
28
28
  )({
29
29
  roleId: RoleId,
30
- minAge: Schema.NullOr(Schema.Number),
31
- maxAge: Schema.NullOr(Schema.Number),
30
+ minAge: Schema.OptionFromNullOr(Schema.Number),
31
+ maxAge: Schema.OptionFromNullOr(Schema.Number),
32
32
  }) {}
33
33
 
34
34
  export class UpdateAgeThresholdRequest extends Schema.Class<UpdateAgeThresholdRequest>(
35
35
  'UpdateAgeThresholdRequest',
36
36
  )({
37
- minAge: Schema.NullOr(Schema.Number),
38
- maxAge: Schema.NullOr(Schema.Number),
37
+ minAge: Schema.OptionFromNullOr(Schema.Number),
38
+ maxAge: Schema.OptionFromNullOr(Schema.Number),
39
39
  }) {}
40
40
 
41
41
  export class Forbidden extends Schema.TaggedError<Forbidden>()(
package/src/api/Auth.ts CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  import { Context, Schema } from 'effect';
9
9
  import { Permission } from '~/models/Role.js';
10
10
  import { TeamId } from '~/models/Team.js';
11
- import { Gender, Locale, Position, Proficiency, UserId } from '~/models/User.js';
11
+ import { Gender, Locale, UserId } from '~/models/User.js';
12
12
 
13
13
  export { UserId } from '~/models/User.js';
14
14
 
@@ -30,9 +30,6 @@ export class CurrentUser extends Schema.Class<CurrentUser>('CurrentUser')({
30
30
  name: Schema.NullOr(Schema.String),
31
31
  birthYear: Schema.NullOr(Schema.Number),
32
32
  gender: Schema.NullOr(Gender),
33
- jerseyNumber: Schema.NullOr(Schema.Number),
34
- position: Schema.NullOr(Position),
35
- proficiency: Schema.NullOr(Proficiency),
36
33
  locale: Locale,
37
34
  }) {}
38
35
 
@@ -56,11 +53,6 @@ export class CompleteProfileRequest extends Schema.Class<CompleteProfileRequest>
56
53
  }),
57
54
  ),
58
55
  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
56
  }) {}
65
57
 
66
58
  export class UpdateProfileRequest extends Schema.Class<UpdateProfileRequest>(
@@ -77,9 +69,6 @@ export class UpdateProfileRequest extends Schema.Class<UpdateProfileRequest>(
77
69
  ),
78
70
  ),
79
71
  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
72
  }) {}
84
73
 
85
74
  export class Unauthorized extends Schema.TaggedError<Unauthorized>()(
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,143 @@
1
+ import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from '@effect/platform';
2
+ import { Schema } from 'effect';
3
+ import { AuthMiddleware } from '~/api/Auth.js';
4
+ import { TeamId } from '~/models/Team.js';
5
+ import { TeamMemberId } from '~/models/TeamMember.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
+ coachCount: Schema.Number,
13
+ }) {}
14
+
15
+ export class TrainingTypeDetail extends Schema.Class<TrainingTypeDetail>('TrainingTypeDetail')({
16
+ trainingTypeId: TrainingTypeId,
17
+ teamId: TeamId,
18
+ name: Schema.String,
19
+ canAdmin: Schema.Boolean,
20
+ coaches: Schema.Array(
21
+ Schema.Struct({
22
+ memberId: TeamMemberId,
23
+ name: Schema.NullOr(Schema.String),
24
+ discordUsername: Schema.String,
25
+ }),
26
+ ),
27
+ }) {}
28
+
29
+ export class TrainingTypeListResponse extends Schema.Class<TrainingTypeListResponse>(
30
+ 'TrainingTypeListResponse',
31
+ )({
32
+ canAdmin: Schema.Boolean,
33
+ trainingTypes: Schema.Array(TrainingTypeInfo),
34
+ }) {}
35
+
36
+ export class CreateTrainingTypeRequest extends Schema.Class<CreateTrainingTypeRequest>(
37
+ 'CreateTrainingTypeRequest',
38
+ )({
39
+ name: Schema.NonEmptyString,
40
+ }) {}
41
+
42
+ export class UpdateTrainingTypeRequest extends Schema.Class<UpdateTrainingTypeRequest>(
43
+ 'UpdateTrainingTypeRequest',
44
+ )({
45
+ name: Schema.NonEmptyString,
46
+ }) {}
47
+
48
+ export class AddTrainingTypeCoachRequest extends Schema.Class<AddTrainingTypeCoachRequest>(
49
+ 'AddTrainingTypeCoachRequest',
50
+ )({
51
+ memberId: TeamMemberId,
52
+ }) {}
53
+
54
+ export class TrainingTypeNotFound extends Schema.TaggedError<TrainingTypeNotFound>()(
55
+ 'TrainingTypeNotFound',
56
+ {},
57
+ HttpApiSchema.annotations({ status: 404 }),
58
+ ) {}
59
+
60
+ export class Forbidden extends Schema.TaggedError<Forbidden>()(
61
+ 'TrainingTypeForbidden',
62
+ {},
63
+ HttpApiSchema.annotations({ status: 403 }),
64
+ ) {}
65
+
66
+ export class MemberNotFound extends Schema.TaggedError<MemberNotFound>()(
67
+ 'TrainingTypeMemberNotFound',
68
+ {},
69
+ HttpApiSchema.annotations({ status: 404 }),
70
+ ) {}
71
+
72
+ export class TrainingTypeApiGroup extends HttpApiGroup.make('trainingType')
73
+ .add(
74
+ HttpApiEndpoint.get('listTrainingTypes', '/teams/:teamId/training-types')
75
+ .addSuccess(TrainingTypeListResponse)
76
+ .addError(Forbidden, { status: 403 })
77
+ .setPath(Schema.Struct({ teamId: TeamId }))
78
+ .middleware(AuthMiddleware),
79
+ )
80
+ .add(
81
+ HttpApiEndpoint.post('createTrainingType', '/teams/:teamId/training-types')
82
+ .addSuccess(TrainingTypeInfo, { status: 201 })
83
+ .addError(Forbidden, { status: 403 })
84
+ .setPath(Schema.Struct({ teamId: TeamId }))
85
+ .setPayload(CreateTrainingTypeRequest)
86
+ .middleware(AuthMiddleware),
87
+ )
88
+ .add(
89
+ HttpApiEndpoint.get('getTrainingType', '/teams/:teamId/training-types/:trainingTypeId')
90
+ .addSuccess(TrainingTypeDetail)
91
+ .addError(Forbidden, { status: 403 })
92
+ .addError(TrainingTypeNotFound, { status: 404 })
93
+ .setPath(Schema.Struct({ teamId: TeamId, trainingTypeId: TrainingTypeId }))
94
+ .middleware(AuthMiddleware),
95
+ )
96
+ .add(
97
+ HttpApiEndpoint.patch('updateTrainingType', '/teams/:teamId/training-types/:trainingTypeId')
98
+ .addSuccess(TrainingTypeInfo)
99
+ .addError(Forbidden, { status: 403 })
100
+ .addError(TrainingTypeNotFound, { status: 404 })
101
+ .setPath(Schema.Struct({ teamId: TeamId, trainingTypeId: TrainingTypeId }))
102
+ .setPayload(UpdateTrainingTypeRequest)
103
+ .middleware(AuthMiddleware),
104
+ )
105
+ .add(
106
+ HttpApiEndpoint.del('deleteTrainingType', '/teams/:teamId/training-types/:trainingTypeId')
107
+ .addSuccess(Schema.Void)
108
+ .addError(Forbidden, { status: 403 })
109
+ .addError(TrainingTypeNotFound, { status: 404 })
110
+ .setPath(Schema.Struct({ teamId: TeamId, trainingTypeId: TrainingTypeId }))
111
+ .middleware(AuthMiddleware),
112
+ )
113
+ .add(
114
+ HttpApiEndpoint.post(
115
+ 'addTrainingTypeCoach',
116
+ '/teams/:teamId/training-types/:trainingTypeId/coaches',
117
+ )
118
+ .addSuccess(Schema.Void, { status: 204 })
119
+ .addError(Forbidden, { status: 403 })
120
+ .addError(TrainingTypeNotFound, { status: 404 })
121
+ .addError(MemberNotFound, { status: 404 })
122
+ .setPath(Schema.Struct({ teamId: TeamId, trainingTypeId: TrainingTypeId }))
123
+ .setPayload(AddTrainingTypeCoachRequest)
124
+ .middleware(AuthMiddleware),
125
+ )
126
+ .add(
127
+ HttpApiEndpoint.del(
128
+ 'removeTrainingTypeCoach',
129
+ '/teams/:teamId/training-types/:trainingTypeId/coaches/:memberId',
130
+ )
131
+ .addSuccess(Schema.Void)
132
+ .addError(Forbidden, { status: 403 })
133
+ .addError(TrainingTypeNotFound, { status: 404 })
134
+ .addError(MemberNotFound, { status: 404 })
135
+ .setPath(
136
+ Schema.Struct({
137
+ teamId: TeamId,
138
+ trainingTypeId: TrainingTypeId,
139
+ memberId: TeamMemberId,
140
+ }),
141
+ )
142
+ .middleware(AuthMiddleware),
143
+ ) {}
package/src/index.ts CHANGED
@@ -14,8 +14,16 @@ export * as Roster from './api/Roster.js';
14
14
 
15
15
  export * as SubgroupApi from './api/SubgroupApi.js';
16
16
 
17
+ export * as TrainingTypeApi from './api/TrainingTypeApi.js';
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
 
21
29
  export * as MemberRole from './models/MemberRole.js';
@@ -40,6 +48,13 @@ export * as TeamInvite from './models/TeamInvite.js';
40
48
 
41
49
  export * as TeamMember from './models/TeamMember.js';
42
50
 
43
- export * as User from './models/User.js';
51
+ export * as TrainingType from './models/TrainingType.js';
44
52
 
45
- export * as RoleSyncRpc from './rpc/RoleSyncRpc.js';
53
+ export * as User from './models/User.js';
54
+ export * as ChannelRpcEvents from './rpc/channel/ChannelRpcEvents.js';
55
+ export * as ChannelRpcGroup from './rpc/channel/ChannelRpcGroup.js';
56
+ export * as ChannelRpcModels from './rpc/channel/ChannelRpcModels.js';
57
+ export * as RoleRpcEvents from './rpc/role/RoleRpcEvents.js';
58
+ export * as RoleRpcGroup from './rpc/role/RoleRpcGroup.js';
59
+ export * as RoleRpcModels from './rpc/role/RoleRpcModels.js';
60
+ export * as SyncRpcs from './rpc/SyncRpcs.js';
@@ -0,0 +1,30 @@
1
+ import { Model } from '@effect/sql';
2
+ import { Schema } from 'effect';
3
+ import { SubgroupId } from '~/models/SubgroupModel.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
+ subgroup_id: SubgroupId,
24
+ subgroup_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 { SubgroupId } from '~/models/SubgroupModel.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
+ subgroup_id: SubgroupId,
15
+ discord_channel_id: Schema.String,
16
+ discord_role_id: Schema.OptionFromNullOr(Schema.String),
17
+ created_at: Model.DateTimeInsertFromDate,
18
+ }) {}
@@ -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
  }) {}
@@ -0,0 +1,13 @@
1
+ import { Model } from '@effect/sql';
2
+ import { Schema } from 'effect';
3
+ import { TeamId } from '~/models/Team.js';
4
+
5
+ export const TrainingTypeId = Schema.String.pipe(Schema.brand('TrainingTypeId'));
6
+ export type TrainingTypeId = typeof TrainingTypeId.Type;
7
+
8
+ export class TrainingType extends Model.Class<TrainingType>('TrainingType')({
9
+ id: Model.Generated(TrainingTypeId),
10
+ team_id: TeamId,
11
+ name: Schema.String,
12
+ created_at: Model.DateTimeInsertFromDate,
13
+ }) {}
@@ -7,12 +7,6 @@ export type UserId = typeof UserId.Type;
7
7
  export const Gender = Schema.Literal('male', 'female', 'other');
8
8
  export type Gender = typeof Gender.Type;
9
9
 
10
- export const Position = Schema.Literal('goalkeeper', 'defender', 'midfielder', 'forward');
11
- export type Position = typeof Position.Type;
12
-
13
- export const Proficiency = Schema.Literal('beginner', 'intermediate', 'advanced', 'pro');
14
- export type Proficiency = typeof Proficiency.Type;
15
-
16
10
  export const Locale = Schema.Literal('en', 'cs');
17
11
  export type Locale = typeof Locale.Type;
18
12
 
@@ -26,9 +20,6 @@ export class User extends Model.Class<User>('User')({
26
20
  name: Schema.NullOr(Schema.String),
27
21
  birth_year: Schema.NullOr(Schema.Number),
28
22
  gender: Schema.NullOr(Gender),
29
- jersey_number: Schema.NullOr(Schema.Number),
30
- position: Schema.NullOr(Position),
31
- proficiency: Schema.NullOr(Proficiency),
32
23
  locale: Locale,
33
24
  created_at: Model.DateTimeInsertFromDate,
34
25
  is_profile_complete: Schema.Boolean,
@@ -0,0 +1,5 @@
1
+ import { RpcGroup } from '@effect/rpc';
2
+ import { ChannelRpcGroup } from './channel/ChannelRpcGroup.js';
3
+ import { RoleRpcGroup } from './role/RoleRpcGroup.js';
4
+
5
+ export class SyncRpcs extends RpcGroup.make().merge(RoleRpcGroup, ChannelRpcGroup) {}
@@ -0,0 +1,57 @@
1
+ import { Schema } from 'effect';
2
+ import { ChannelSyncEvent, Discord, SubgroupModel, Team, TeamMember } from '~/index.js';
3
+
4
+ export class ChannelCreatedEvent extends Schema.TaggedClass<ChannelCreatedEvent>()(
5
+ 'channel_created',
6
+ {
7
+ id: ChannelSyncEvent.ChannelSyncEventId,
8
+ team_id: Team.TeamId,
9
+ guild_id: Discord.Snowflake,
10
+ subgroup_id: SubgroupModel.SubgroupId,
11
+ subgroup_name: Schema.String,
12
+ },
13
+ ) {}
14
+
15
+ export class ChannelDeletedEvent extends Schema.TaggedClass<ChannelDeletedEvent>()(
16
+ 'channel_deleted',
17
+ {
18
+ id: ChannelSyncEvent.ChannelSyncEventId,
19
+ team_id: Team.TeamId,
20
+ guild_id: Discord.Snowflake,
21
+ subgroup_id: SubgroupModel.SubgroupId,
22
+ },
23
+ ) {}
24
+
25
+ export class ChannelMemberAddedEvent extends Schema.TaggedClass<ChannelMemberAddedEvent>()(
26
+ 'channel_member_added',
27
+ {
28
+ id: ChannelSyncEvent.ChannelSyncEventId,
29
+ team_id: Team.TeamId,
30
+ guild_id: Discord.Snowflake,
31
+ subgroup_id: SubgroupModel.SubgroupId,
32
+ subgroup_name: Schema.String,
33
+ team_member_id: TeamMember.TeamMemberId,
34
+ discord_user_id: Discord.Snowflake,
35
+ },
36
+ ) {}
37
+
38
+ export class ChannelMemberRemovedEvent extends Schema.TaggedClass<ChannelMemberRemovedEvent>()(
39
+ 'channel_member_removed',
40
+ {
41
+ id: ChannelSyncEvent.ChannelSyncEventId,
42
+ team_id: Team.TeamId,
43
+ guild_id: Discord.Snowflake,
44
+ subgroup_id: SubgroupModel.SubgroupId,
45
+ team_member_id: TeamMember.TeamMemberId,
46
+ discord_user_id: Discord.Snowflake,
47
+ },
48
+ ) {}
49
+
50
+ export const UnprocessedChannelEvent = Schema.Union(
51
+ ChannelCreatedEvent,
52
+ ChannelDeletedEvent,
53
+ ChannelMemberAddedEvent,
54
+ ChannelMemberRemovedEvent,
55
+ );
56
+
57
+ export type UnprocessedChannelEvent = Schema.Schema.Type<typeof UnprocessedChannelEvent>;
@@ -0,0 +1,33 @@
1
+ import { Rpc, RpcGroup } from '@effect/rpc';
2
+ import { Schema } from 'effect';
3
+ import { ChannelSyncEvent, Discord, SubgroupModel, Team } from '~/index.js';
4
+ import { UnprocessedChannelEvent } from './ChannelRpcEvents.js';
5
+ import { ChannelMapping } from './ChannelRpcModels.js';
6
+
7
+ export const ChannelRpcGroup = RpcGroup.make(
8
+ Rpc.make('GetUnprocessedEvents', {
9
+ payload: { limit: Schema.Number },
10
+ success: Schema.Array(UnprocessedChannelEvent),
11
+ }),
12
+ Rpc.make('MarkEventProcessed', {
13
+ payload: { id: ChannelSyncEvent.ChannelSyncEventId },
14
+ }),
15
+ Rpc.make('MarkEventFailed', {
16
+ payload: { id: ChannelSyncEvent.ChannelSyncEventId, error: Schema.String },
17
+ }),
18
+ Rpc.make('GetMapping', {
19
+ payload: { team_id: Team.TeamId, subgroup_id: SubgroupModel.SubgroupId },
20
+ success: Schema.OptionFromNullOr(ChannelMapping),
21
+ }),
22
+ Rpc.make('UpsertMapping', {
23
+ payload: {
24
+ team_id: Team.TeamId,
25
+ subgroup_id: SubgroupModel.SubgroupId,
26
+ discord_channel_id: Discord.Snowflake,
27
+ discord_role_id: Discord.Snowflake,
28
+ },
29
+ }),
30
+ Rpc.make('DeleteMapping', {
31
+ payload: { team_id: Team.TeamId, subgroup_id: SubgroupModel.SubgroupId },
32
+ }),
33
+ ).prefix('Channel/');
@@ -0,0 +1,10 @@
1
+ import { Schema } from 'effect';
2
+ import { Discord, DiscordChannelMapping, SubgroupModel, Team } from '~/index.js';
3
+
4
+ export class ChannelMapping extends Schema.Class<ChannelMapping>('ChannelMapping')({
5
+ id: DiscordChannelMapping.DiscordChannelMappingId,
6
+ team_id: Team.TeamId,
7
+ subgroup_id: SubgroupModel.SubgroupId,
8
+ discord_channel_id: Discord.Snowflake,
9
+ discord_role_id: Schema.OptionFromNullOr(Discord.Snowflake),
10
+ }) {}
@@ -0,0 +1,48 @@
1
+ import { Schema } from 'effect';
2
+ import { Discord, Role, RoleSyncEvent, Team, TeamMember } from '~/index.js';
3
+
4
+ export class RoleCreatedEvent extends Schema.TaggedClass<RoleCreatedEvent>()('role_created', {
5
+ id: RoleSyncEvent.RoleSyncEventId,
6
+ team_id: Team.TeamId,
7
+ guild_id: Discord.Snowflake,
8
+ role_id: Role.RoleId,
9
+ role_name: Schema.String,
10
+ }) {}
11
+
12
+ export class RoleDeletedEvent extends Schema.TaggedClass<RoleDeletedEvent>()('role_deleted', {
13
+ id: RoleSyncEvent.RoleSyncEventId,
14
+ team_id: Team.TeamId,
15
+ guild_id: Discord.Snowflake,
16
+ role_id: Role.RoleId,
17
+ }) {}
18
+
19
+ export class RoleAssignedEvent extends Schema.TaggedClass<RoleAssignedEvent>()('role_assigned', {
20
+ id: RoleSyncEvent.RoleSyncEventId,
21
+ team_id: Team.TeamId,
22
+ guild_id: Discord.Snowflake,
23
+ role_id: Role.RoleId,
24
+ role_name: Schema.String,
25
+ team_member_id: TeamMember.TeamMemberId,
26
+ discord_user_id: Discord.Snowflake,
27
+ }) {}
28
+
29
+ export class RoleUnassignedEvent extends Schema.TaggedClass<RoleUnassignedEvent>()(
30
+ 'role_unassigned',
31
+ {
32
+ id: RoleSyncEvent.RoleSyncEventId,
33
+ team_id: Team.TeamId,
34
+ guild_id: Discord.Snowflake,
35
+ role_id: Role.RoleId,
36
+ team_member_id: TeamMember.TeamMemberId,
37
+ discord_user_id: Discord.Snowflake,
38
+ },
39
+ ) {}
40
+
41
+ export const UnprocessedRoleEvent = Schema.Union(
42
+ RoleCreatedEvent,
43
+ RoleDeletedEvent,
44
+ RoleAssignedEvent,
45
+ RoleUnassignedEvent,
46
+ );
47
+
48
+ export type UnprocessedRoleEvent = Schema.Schema.Type<typeof UnprocessedRoleEvent>;
@@ -0,0 +1,33 @@
1
+ import { Rpc, RpcGroup } from '@effect/rpc';
2
+ import { Schema } from 'effect';
3
+ import { Discord, Role, RoleSyncEvent, Team } from '~/index.js';
4
+ import { UnprocessedRoleEvent } from './RoleRpcEvents.js';
5
+ import { RoleMapping } from './RoleRpcModels.js';
6
+
7
+ export const RoleRpcGroup = RpcGroup.make(
8
+ Rpc.make('GetUnprocessedEvents', {
9
+ payload: { limit: Schema.Number },
10
+ success: Schema.Array(UnprocessedRoleEvent),
11
+ }),
12
+ Rpc.make('MarkEventProcessed', {
13
+ payload: { id: RoleSyncEvent.RoleSyncEventId },
14
+ }),
15
+ Rpc.make('MarkEventFailed', {
16
+ payload: { id: RoleSyncEvent.RoleSyncEventId, error: Schema.String },
17
+ }),
18
+ Rpc.make('GetMapping', {
19
+ payload: { team_id: Team.TeamId, role_id: Role.RoleId },
20
+ success: Schema.OptionFromNullOr(RoleMapping),
21
+ }),
22
+ Rpc.make('UpsertMapping', {
23
+ payload: {
24
+ team_id: Team.TeamId,
25
+ role_id: Role.RoleId,
26
+ discord_role_id: Discord.Snowflake,
27
+ },
28
+ }),
29
+
30
+ Rpc.make('DeleteMapping', {
31
+ payload: { team_id: Team.TeamId, role_id: Role.RoleId },
32
+ }),
33
+ ).prefix('Role/');
@@ -0,0 +1,9 @@
1
+ import { Schema } from 'effect';
2
+ import { Discord, DiscordRoleMapping, Role, Team } from '~/index.js';
3
+
4
+ export class RoleMapping extends Schema.Class<RoleMapping>('RoleMapping')({
5
+ id: DiscordRoleMapping.DiscordRoleMappingId,
6
+ team_id: Team.TeamId,
7
+ role_id: Role.RoleId,
8
+ discord_role_id: Discord.Snowflake,
9
+ }) {}