@sideline/domain 0.11.0 → 0.12.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 (84) hide show
  1. package/dist/cjs/api/ActivityLogApi.js +126 -0
  2. package/dist/cjs/api/ActivityLogApi.js.map +1 -0
  3. package/dist/cjs/api/ActivityStatsApi.js +37 -0
  4. package/dist/cjs/api/ActivityStatsApi.js.map +1 -0
  5. package/dist/cjs/index.js +15 -1
  6. package/dist/cjs/models/ActivityLog.js +24 -0
  7. package/dist/cjs/models/ActivityLog.js.map +1 -0
  8. package/dist/cjs/models/ActivityStats.js +120 -0
  9. package/dist/cjs/models/ActivityStats.js.map +1 -0
  10. package/dist/cjs/models/ActivityType.js +10 -0
  11. package/dist/cjs/models/ActivityType.js.map +1 -0
  12. package/dist/cjs/rpc/SyncRpcs.js +2 -1
  13. package/dist/cjs/rpc/SyncRpcs.js.map +1 -1
  14. package/dist/cjs/rpc/activity/ActivityRpcGroup.js +29 -0
  15. package/dist/cjs/rpc/activity/ActivityRpcGroup.js.map +1 -0
  16. package/dist/cjs/rpc/activity/ActivityRpcModels.js +31 -0
  17. package/dist/cjs/rpc/activity/ActivityRpcModels.js.map +1 -0
  18. package/dist/cjs/rpc/event/EventRpcGroup.js +7 -1
  19. package/dist/cjs/rpc/event/EventRpcGroup.js.map +1 -1
  20. package/dist/cjs/rpc/event/EventRpcModels.js +7 -1
  21. package/dist/cjs/rpc/event/EventRpcModels.js.map +1 -1
  22. package/dist/dts/api/ActivityLogApi.d.ts +163 -0
  23. package/dist/dts/api/ActivityLogApi.d.ts.map +1 -0
  24. package/dist/dts/api/ActivityStatsApi.d.ts +58 -0
  25. package/dist/dts/api/ActivityStatsApi.d.ts.map +1 -0
  26. package/dist/dts/api/AgeThresholdApi.d.ts +2 -2
  27. package/dist/dts/api/EventApi.d.ts +4 -4
  28. package/dist/dts/api/GroupApi.d.ts +1 -1
  29. package/dist/dts/index.d.ts +7 -0
  30. package/dist/dts/index.d.ts.map +1 -1
  31. package/dist/dts/models/ActivityLog.d.ts +122 -0
  32. package/dist/dts/models/ActivityLog.d.ts.map +1 -0
  33. package/dist/dts/models/ActivityStats.d.ts +28 -0
  34. package/dist/dts/models/ActivityStats.d.ts.map +1 -0
  35. package/dist/dts/models/ActivityType.d.ts +6 -0
  36. package/dist/dts/models/ActivityType.d.ts.map +1 -0
  37. package/dist/dts/models/ChannelSyncEvent.d.ts +4 -4
  38. package/dist/dts/models/Event.d.ts +2 -2
  39. package/dist/dts/models/EventRsvp.d.ts +4 -4
  40. package/dist/dts/models/RoleSyncEvent.d.ts +4 -4
  41. package/dist/dts/rpc/SyncRpcs.d.ts +14 -2
  42. package/dist/dts/rpc/SyncRpcs.d.ts.map +1 -1
  43. package/dist/dts/rpc/activity/ActivityRpcGroup.d.ts +14 -0
  44. package/dist/dts/rpc/activity/ActivityRpcGroup.d.ts.map +1 -0
  45. package/dist/dts/rpc/activity/ActivityRpcModels.d.ts +67 -0
  46. package/dist/dts/rpc/activity/ActivityRpcModels.d.ts.map +1 -0
  47. package/dist/dts/rpc/event/EventRpcGroup.d.ts +5 -2
  48. package/dist/dts/rpc/event/EventRpcGroup.d.ts.map +1 -1
  49. package/dist/dts/rpc/event/EventRpcModels.d.ts +13 -0
  50. package/dist/dts/rpc/event/EventRpcModels.d.ts.map +1 -1
  51. package/dist/esm/api/ActivityLogApi.js +108 -0
  52. package/dist/esm/api/ActivityLogApi.js.map +1 -0
  53. package/dist/esm/api/ActivityStatsApi.js +27 -0
  54. package/dist/esm/api/ActivityStatsApi.js.map +1 -0
  55. package/dist/esm/index.js +7 -0
  56. package/dist/esm/index.js.map +1 -1
  57. package/dist/esm/models/ActivityLog.js +17 -0
  58. package/dist/esm/models/ActivityLog.js.map +1 -0
  59. package/dist/esm/models/ActivityStats.js +111 -0
  60. package/dist/esm/models/ActivityStats.js.map +1 -0
  61. package/dist/esm/models/ActivityType.js +4 -0
  62. package/dist/esm/models/ActivityType.js.map +1 -0
  63. package/dist/esm/rpc/SyncRpcs.js +2 -1
  64. package/dist/esm/rpc/SyncRpcs.js.map +1 -1
  65. package/dist/esm/rpc/activity/ActivityRpcGroup.js +23 -0
  66. package/dist/esm/rpc/activity/ActivityRpcGroup.js.map +1 -0
  67. package/dist/esm/rpc/activity/ActivityRpcModels.js +21 -0
  68. package/dist/esm/rpc/activity/ActivityRpcModels.js.map +1 -0
  69. package/dist/esm/rpc/event/EventRpcGroup.js +9 -3
  70. package/dist/esm/rpc/event/EventRpcGroup.js.map +1 -1
  71. package/dist/esm/rpc/event/EventRpcModels.js +5 -0
  72. package/dist/esm/rpc/event/EventRpcModels.js.map +1 -1
  73. package/package.json +1 -1
  74. package/src/api/ActivityLogApi.ts +135 -0
  75. package/src/api/ActivityStatsApi.ts +42 -0
  76. package/src/index.ts +12 -0
  77. package/src/models/ActivityLog.ts +21 -0
  78. package/src/models/ActivityStats.ts +131 -0
  79. package/src/models/ActivityType.ts +7 -0
  80. package/src/rpc/SyncRpcs.ts +2 -0
  81. package/src/rpc/activity/ActivityRpcGroup.ts +31 -0
  82. package/src/rpc/activity/ActivityRpcModels.ts +32 -0
  83. package/src/rpc/event/EventRpcGroup.ts +7 -1
  84. package/src/rpc/event/EventRpcModels.ts +6 -0
@@ -1,5 +1,14 @@
1
1
  import { RpcGroup } from '@effect/rpc';
2
- declare const SyncRpcs_base: RpcGroup.RpcGroup<import("@effect/rpc/Rpc").Rpc<"Channel/GetUnprocessedEvents", import("effect/Schema").Struct<{
2
+ declare const SyncRpcs_base: RpcGroup.RpcGroup<import("@effect/rpc/Rpc").Rpc<"Activity/LogActivity", import("effect/Schema").Struct<{
3
+ guild_id: import("effect/Schema").brand<typeof import("effect/Schema").String, "Snowflake">;
4
+ discord_user_id: import("effect/Schema").brand<typeof import("effect/Schema").String, "Snowflake">;
5
+ activity_type: typeof import("effect/Schema").String;
6
+ duration_minutes: import("effect/Schema").OptionFromNullOr<import("effect/Schema").filter<typeof import("effect/Schema").Int>>;
7
+ note: import("effect/Schema").OptionFromNullOr<typeof import("effect/Schema").String>;
8
+ }>, typeof import("./activity/ActivityRpcModels.js").LogActivityResult, import("effect/Schema").Union<[typeof import("./activity/ActivityRpcModels.js").ActivityMemberNotFound, typeof import("./activity/ActivityRpcModels.js").ActivityGuildNotFound]>, never> | import("@effect/rpc/Rpc").Rpc<"Activity/GetStats", import("effect/Schema").Struct<{
9
+ guild_id: import("effect/Schema").brand<typeof import("effect/Schema").String, "Snowflake">;
10
+ discord_user_id: import("effect/Schema").brand<typeof import("effect/Schema").String, "Snowflake">;
11
+ }>, typeof import("./activity/ActivityRpcModels.js").GetStatsResult, import("effect/Schema").Union<[typeof import("./activity/ActivityRpcModels.js").ActivityMemberNotFound, typeof import("./activity/ActivityRpcModels.js").ActivityGuildNotFound]>, never> | import("@effect/rpc/Rpc").Rpc<"Channel/GetUnprocessedEvents", import("effect/Schema").Struct<{
3
12
  limit: typeof import("effect/Schema").Number;
4
13
  }>, import("effect/Schema").Array$<import("effect/Schema").Union<[typeof import("./channel/ChannelRpcEvents.js").ChannelCreatedEvent, typeof import("./channel/ChannelRpcEvents.js").ChannelDeletedEvent, typeof import("./channel/ChannelRpcEvents.js").ChannelMemberAddedEvent, typeof import("./channel/ChannelRpcEvents.js").ChannelMemberRemovedEvent]>>, typeof import("effect/Schema").Never, never> | import("@effect/rpc/Rpc").Rpc<"Channel/MarkEventProcessed", import("effect/Schema").Struct<{
5
14
  id: import("effect/Schema").brand<typeof import("effect/Schema").String, "ChannelSyncEventId">;
@@ -52,7 +61,9 @@ declare const SyncRpcs_base: RpcGroup.RpcGroup<import("@effect/rpc/Rpc").Rpc<"Ch
52
61
  guild_id: import("effect/Schema").brand<typeof import("effect/Schema").String, "Snowflake">;
53
62
  offset: typeof import("effect/Schema").Number;
54
63
  limit: typeof import("effect/Schema").Number;
55
- }>, typeof import("./event/EventRpcModels.js").GuildEventListResult, typeof import("./event/EventRpcModels.js").GuildNotFound, never> | import("@effect/rpc/Rpc").Rpc<"Event/CreateEvent", import("effect/Schema").Struct<{
64
+ }>, typeof import("./event/EventRpcModels.js").GuildEventListResult, typeof import("./event/EventRpcModels.js").GuildNotFound, never> | import("@effect/rpc/Rpc").Rpc<"Event/GetTrainingTypesByGuild", import("effect/Schema").Struct<{
65
+ guild_id: import("effect/Schema").brand<typeof import("effect/Schema").String, "Snowflake">;
66
+ }>, import("effect/Schema").Array$<typeof import("./event/EventRpcModels.js").TrainingTypeChoice>, typeof import("effect/Schema").Never, never> | import("@effect/rpc/Rpc").Rpc<"Event/CreateEvent", import("effect/Schema").Struct<{
56
67
  guild_id: import("effect/Schema").brand<typeof import("effect/Schema").String, "Snowflake">;
57
68
  discord_user_id: import("effect/Schema").brand<typeof import("effect/Schema").String, "Snowflake">;
58
69
  event_type: import("effect/Schema").Literal<["training", "match", "tournament", "meeting", "social", "other"]>;
@@ -61,6 +72,7 @@ declare const SyncRpcs_base: RpcGroup.RpcGroup<import("@effect/rpc/Rpc").Rpc<"Ch
61
72
  end_at: import("effect/Schema").OptionFromNullOr<typeof import("effect/Schema").String>;
62
73
  location: import("effect/Schema").OptionFromNullOr<typeof import("effect/Schema").String>;
63
74
  description: import("effect/Schema").OptionFromNullOr<typeof import("effect/Schema").String>;
75
+ training_type_id: import("effect/Schema").OptionFromNullOr<import("effect/Schema").brand<typeof import("effect/Schema").String, "TrainingTypeId">>;
64
76
  }>, typeof import("./event/EventRpcModels.js").CreateEventResult, import("effect/Schema").Union<[typeof import("./event/EventRpcModels.js").CreateEventNotMember, typeof import("./event/EventRpcModels.js").CreateEventForbidden, typeof import("./event/EventRpcModels.js").CreateEventInvalidDate]>, never> | import("@effect/rpc/Rpc").Rpc<"Guild/RegisterGuild", import("effect/Schema").Struct<{
65
77
  guild_id: import("effect/Schema").brand<typeof import("effect/Schema").String, "Snowflake">;
66
78
  guild_name: typeof import("effect/Schema").String;
@@ -1 +1 @@
1
- {"version":3,"file":"SyncRpcs.d.ts","sourceRoot":"","sources":["../../../src/rpc/SyncRpcs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMvC,qBAAa,QAAS,SAAQ,aAK7B;CAAG"}
1
+ {"version":3,"file":"SyncRpcs.d.ts","sourceRoot":"","sources":["../../../src/rpc/SyncRpcs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOvC,qBAAa,QAAS,SAAQ,aAM7B;CAAG"}
@@ -0,0 +1,14 @@
1
+ import { Rpc, RpcGroup } from '@effect/rpc';
2
+ import { Schema } from 'effect';
3
+ import { ActivityGuildNotFound, ActivityMemberNotFound, GetStatsResult, LogActivityResult } from './ActivityRpcModels.js';
4
+ export declare const ActivityRpcGroup: RpcGroup.RpcGroup<Rpc.Rpc<"Activity/LogActivity", Schema.Struct<{
5
+ guild_id: Schema.brand<typeof Schema.String, "Snowflake">;
6
+ discord_user_id: Schema.brand<typeof Schema.String, "Snowflake">;
7
+ activity_type: typeof Schema.String;
8
+ duration_minutes: Schema.OptionFromNullOr<Schema.filter<typeof Schema.Int>>;
9
+ note: Schema.OptionFromNullOr<typeof Schema.String>;
10
+ }>, typeof LogActivityResult, Schema.Union<[typeof ActivityMemberNotFound, typeof ActivityGuildNotFound]>, never> | Rpc.Rpc<"Activity/GetStats", Schema.Struct<{
11
+ guild_id: Schema.brand<typeof Schema.String, "Snowflake">;
12
+ discord_user_id: Schema.brand<typeof Schema.String, "Snowflake">;
13
+ }>, typeof GetStatsResult, Schema.Union<[typeof ActivityMemberNotFound, typeof ActivityGuildNotFound]>, never>>;
14
+ //# sourceMappingURL=ActivityRpcGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityRpcGroup.d.ts","sourceRoot":"","sources":["../../../../src/rpc/activity/ActivityRpcGroup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAEhC,eAAO,MAAM,gBAAgB;;;;;;;;;+GAoBR,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { Schema } from 'effect';
2
+ declare const LogActivityResult_base: Schema.Class<LogActivityResult, {
3
+ id: Schema.brand<typeof Schema.String, "ActivityLogId">;
4
+ activity_type_id: typeof Schema.String;
5
+ logged_at: typeof Schema.String;
6
+ }, Schema.Struct.Encoded<{
7
+ id: Schema.brand<typeof Schema.String, "ActivityLogId">;
8
+ activity_type_id: typeof Schema.String;
9
+ logged_at: typeof Schema.String;
10
+ }>, never, {
11
+ readonly id: string & import("effect/Brand").Brand<"ActivityLogId">;
12
+ } & {
13
+ readonly activity_type_id: string;
14
+ } & {
15
+ readonly logged_at: string;
16
+ }, {}, {}>;
17
+ export declare class LogActivityResult extends LogActivityResult_base {
18
+ }
19
+ declare const ActivityMemberNotFound_base: Schema.TaggedErrorClass<ActivityMemberNotFound, "ActivityMemberNotFound", {
20
+ readonly _tag: Schema.tag<"ActivityMemberNotFound">;
21
+ }>;
22
+ export declare class ActivityMemberNotFound extends ActivityMemberNotFound_base {
23
+ }
24
+ declare const ActivityGuildNotFound_base: Schema.TaggedErrorClass<ActivityGuildNotFound, "ActivityGuildNotFound", {
25
+ readonly _tag: Schema.tag<"ActivityGuildNotFound">;
26
+ }>;
27
+ export declare class ActivityGuildNotFound extends ActivityGuildNotFound_base {
28
+ }
29
+ declare const GetStatsResult_base: Schema.Class<GetStatsResult, {
30
+ current_streak: typeof Schema.Int;
31
+ longest_streak: typeof Schema.Int;
32
+ total_activities: typeof Schema.Int;
33
+ total_duration_minutes: typeof Schema.Int;
34
+ counts: Schema.Array$<Schema.Struct<{
35
+ activity_type_id: typeof Schema.String;
36
+ activity_type_name: typeof Schema.String;
37
+ count: typeof Schema.Int;
38
+ }>>;
39
+ }, Schema.Struct.Encoded<{
40
+ current_streak: typeof Schema.Int;
41
+ longest_streak: typeof Schema.Int;
42
+ total_activities: typeof Schema.Int;
43
+ total_duration_minutes: typeof Schema.Int;
44
+ counts: Schema.Array$<Schema.Struct<{
45
+ activity_type_id: typeof Schema.String;
46
+ activity_type_name: typeof Schema.String;
47
+ count: typeof Schema.Int;
48
+ }>>;
49
+ }>, never, {
50
+ readonly counts: readonly {
51
+ readonly activity_type_id: string;
52
+ readonly count: number;
53
+ readonly activity_type_name: string;
54
+ }[];
55
+ } & {
56
+ readonly current_streak: number;
57
+ } & {
58
+ readonly longest_streak: number;
59
+ } & {
60
+ readonly total_activities: number;
61
+ } & {
62
+ readonly total_duration_minutes: number;
63
+ }, {}, {}>;
64
+ export declare class GetStatsResult extends GetStatsResult_base {
65
+ }
66
+ export {};
67
+ //# sourceMappingURL=ActivityRpcModels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityRpcModels.d.ts","sourceRoot":"","sources":["../../../../src/rpc/activity/ActivityRpcModels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;;;;;;;;;;;;;AAGhC,qBAAa,iBAAkB,SAAQ,sBAIrC;CAAG;;;;AAEL,qBAAa,sBAAuB,SAAQ,2BAG3C;CAAG;;;;AAEJ,qBAAa,qBAAsB,SAAQ,0BAG1C;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEJ,qBAAa,cAAe,SAAQ,mBAYlC;CAAG"}
@@ -1,6 +1,6 @@
1
1
  import { Rpc, RpcGroup } from '@effect/rpc';
2
2
  import { Schema } from 'effect';
3
- import { ChannelEventEntry, CreateEventForbidden, CreateEventInvalidDate, CreateEventNotMember, CreateEventResult, EventDiscordMessage, EventEmbedInfo, GuildEventListResult, GuildNotFound, RsvpAttendeesResult, RsvpCountsResult, RsvpDeadlinePassed, RsvpEventNotFound, RsvpMemberNotFound, RsvpNotGroupMember, RsvpReminderSummary } from './EventRpcModels.js';
3
+ import { ChannelEventEntry, CreateEventForbidden, CreateEventInvalidDate, CreateEventNotMember, CreateEventResult, EventDiscordMessage, EventEmbedInfo, GuildEventListResult, GuildNotFound, RsvpAttendeesResult, RsvpCountsResult, RsvpDeadlinePassed, RsvpEventNotFound, RsvpMemberNotFound, RsvpNotGroupMember, RsvpReminderSummary, TrainingTypeChoice } from './EventRpcModels.js';
4
4
  export declare const EventRpcGroup: RpcGroup.RpcGroup<Rpc.Rpc<"Event/GetUnprocessedEvents", Schema.Struct<{
5
5
  limit: typeof Schema.Number;
6
6
  }>, Schema.Array$<Schema.Union<[typeof import("./EventRpcEvents.js").EventCreatedEvent, typeof import("./EventRpcEvents.js").EventUpdatedEvent, typeof import("./EventRpcEvents.js").EventCancelledEvent, typeof import("./EventRpcEvents.js").RsvpReminderEvent]>>, typeof Schema.Never, never> | Rpc.Rpc<"Event/MarkEventProcessed", Schema.Struct<{
@@ -36,7 +36,9 @@ export declare const EventRpcGroup: RpcGroup.RpcGroup<Rpc.Rpc<"Event/GetUnproces
36
36
  guild_id: Schema.brand<typeof Schema.String, "Snowflake">;
37
37
  offset: typeof Schema.Number;
38
38
  limit: typeof Schema.Number;
39
- }>, typeof GuildEventListResult, typeof GuildNotFound, never> | Rpc.Rpc<"Event/CreateEvent", Schema.Struct<{
39
+ }>, typeof GuildEventListResult, typeof GuildNotFound, never> | Rpc.Rpc<"Event/GetTrainingTypesByGuild", Schema.Struct<{
40
+ guild_id: Schema.brand<typeof Schema.String, "Snowflake">;
41
+ }>, Schema.Array$<typeof TrainingTypeChoice>, typeof Schema.Never, never> | Rpc.Rpc<"Event/CreateEvent", Schema.Struct<{
40
42
  guild_id: Schema.brand<typeof Schema.String, "Snowflake">;
41
43
  discord_user_id: Schema.brand<typeof Schema.String, "Snowflake">;
42
44
  event_type: Schema.Literal<["training", "match", "tournament", "meeting", "social", "other"]>;
@@ -45,5 +47,6 @@ export declare const EventRpcGroup: RpcGroup.RpcGroup<Rpc.Rpc<"Event/GetUnproces
45
47
  end_at: Schema.OptionFromNullOr<typeof Schema.String>;
46
48
  location: Schema.OptionFromNullOr<typeof Schema.String>;
47
49
  description: Schema.OptionFromNullOr<typeof Schema.String>;
50
+ training_type_id: Schema.OptionFromNullOr<Schema.brand<typeof Schema.String, "TrainingTypeId">>;
48
51
  }>, typeof CreateEventResult, Schema.Union<[typeof CreateEventNotMember, typeof CreateEventForbidden, typeof CreateEventInvalidDate]>, never>>;
49
52
  //# sourceMappingURL=EventRpcGroup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EventRpcGroup.d.ts","sourceRoot":"","sources":["../../../../src/rpc/event/EventRpcGroup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8IAiFR,CAAC"}
1
+ {"version":3,"file":"EventRpcGroup.d.ts","sourceRoot":"","sources":["../../../../src/rpc/event/EventRpcGroup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8IAsFR,CAAC"}
@@ -290,5 +290,18 @@ declare const RsvpReminderSummary_base: Schema.Class<RsvpReminderSummary, {
290
290
  }, {}, {}>;
291
291
  export declare class RsvpReminderSummary extends RsvpReminderSummary_base {
292
292
  }
293
+ declare const TrainingTypeChoice_base: Schema.Class<TrainingTypeChoice, {
294
+ id: Schema.brand<typeof Schema.String, "TrainingTypeId">;
295
+ name: typeof Schema.String;
296
+ }, Schema.Struct.Encoded<{
297
+ id: Schema.brand<typeof Schema.String, "TrainingTypeId">;
298
+ name: typeof Schema.String;
299
+ }>, never, {
300
+ readonly name: string;
301
+ } & {
302
+ readonly id: string & import("effect/Brand").Brand<"TrainingTypeId">;
303
+ }, {}, {}>;
304
+ export declare class TrainingTypeChoice extends TrainingTypeChoice_base {
305
+ }
293
306
  export {};
294
307
  //# sourceMappingURL=EventRpcModels.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EventRpcModels.d.ts","sourceRoot":"","sources":["../../../../src/rpc/event/EventRpcModels.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;;;;;;;;;AAGhC,qBAAa,mBAAoB,SAAQ,wBAGvC;CAAG;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,gBAAiB,SAAQ,qBAKpC;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,cAAe,SAAQ,mBAOlC;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,iBAAkB,SAAQ,sBAWrC;CAAG;;;;AAEL,qBAAa,kBAAmB,SAAQ,uBAGvC;CAAG;;;;AAEJ,qBAAa,kBAAmB,SAAQ,uBAGvC;CAAG;;;;AAEJ,qBAAa,iBAAkB,SAAQ,sBAGtC;CAAG;;;;AAEJ,qBAAa,kBAAmB,SAAQ,uBAGvC;CAAG;;;;AAEJ,qBAAa,oBAAqB,SAAQ,yBAGzC;CAAG;;;;AAEJ,qBAAa,oBAAqB,SAAQ,yBAGzC;CAAG;;;;AAEJ,qBAAa,sBAAuB,SAAQ,2BAG3C;CAAG;;;;;;;;;;;;AAEJ,qBAAa,iBAAkB,SAAQ,sBAGrC;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,mBAAoB,SAAQ,wBAUvC;CAAG;;;;;;;;;;;;;;;;AAEL,qBAAa,oBAAqB,SAAQ,yBAMxC;CAAG;;;;AAEL,qBAAa,aAAc,SAAQ,kBAAwD;CAAG;;;;;;;;;;;;;;;;;;;;AAE9F,qBAAa,iBAAkB,SAAQ,sBAKrC;CAAG;;;;;;;;;;;;AAEL,qBAAa,mBAAoB,SAAQ,wBAGvC;CAAG;;;;;;;;;;;;;;;;AAEL,qBAAa,oBAAqB,SAAQ,yBAMxC;CAAG;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,mBAAoB,SAAQ,wBAKvC;CAAG"}
1
+ {"version":3,"file":"EventRpcModels.d.ts","sourceRoot":"","sources":["../../../../src/rpc/event/EventRpcModels.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;;;;;;;;;AAIhC,qBAAa,mBAAoB,SAAQ,wBAGvC;CAAG;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,gBAAiB,SAAQ,qBAKpC;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,cAAe,SAAQ,mBAOlC;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,iBAAkB,SAAQ,sBAWrC;CAAG;;;;AAEL,qBAAa,kBAAmB,SAAQ,uBAGvC;CAAG;;;;AAEJ,qBAAa,kBAAmB,SAAQ,uBAGvC;CAAG;;;;AAEJ,qBAAa,iBAAkB,SAAQ,sBAGtC;CAAG;;;;AAEJ,qBAAa,kBAAmB,SAAQ,uBAGvC;CAAG;;;;AAEJ,qBAAa,oBAAqB,SAAQ,yBAGzC;CAAG;;;;AAEJ,qBAAa,oBAAqB,SAAQ,yBAGzC;CAAG;;;;AAEJ,qBAAa,sBAAuB,SAAQ,2BAG3C;CAAG;;;;;;;;;;;;AAEJ,qBAAa,iBAAkB,SAAQ,sBAGrC;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,mBAAoB,SAAQ,wBAUvC;CAAG;;;;;;;;;;;;;;;;AAEL,qBAAa,oBAAqB,SAAQ,yBAMxC;CAAG;;;;AAEL,qBAAa,aAAc,SAAQ,kBAAwD;CAAG;;;;;;;;;;;;;;;;;;;;AAE9F,qBAAa,iBAAkB,SAAQ,sBAKrC;CAAG;;;;;;;;;;;;AAEL,qBAAa,mBAAoB,SAAQ,wBAGvC;CAAG;;;;;;;;;;;;;;;;AAEL,qBAAa,oBAAqB,SAAQ,yBAMxC;CAAG;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,mBAAoB,SAAQ,wBAKvC;CAAG;;;;;;;;;;;;AAEL,qBAAa,kBAAmB,SAAQ,uBAGtC;CAAG"}
@@ -0,0 +1,108 @@
1
+ import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from '@effect/platform';
2
+ import { Schema } from 'effect';
3
+ import { AuthMiddleware } from '../api/Auth.js';
4
+ import { ActivityLogId, ActivitySource } from '../models/ActivityLog.js';
5
+ import { ActivityTypeId } from '../models/ActivityType.js';
6
+ import { TeamId } from '../models/Team.js';
7
+ import { TeamMemberId } from '../models/TeamMember.js';
8
+ export class ActivityLogEntry extends /*#__PURE__*/Schema.Class('ActivityLogEntry')({
9
+ id: ActivityLogId,
10
+ activityTypeId: ActivityTypeId,
11
+ activityTypeName: Schema.String,
12
+ loggedAt: Schema.String,
13
+ durationMinutes: /*#__PURE__*/Schema.OptionFromNullOr(Schema.Int),
14
+ note: /*#__PURE__*/Schema.OptionFromNullOr(Schema.String),
15
+ source: ActivitySource
16
+ }) {}
17
+ export class ActivityLogListResponse extends /*#__PURE__*/Schema.Class('ActivityLogListResponse')({
18
+ logs: /*#__PURE__*/Schema.Array(ActivityLogEntry)
19
+ }) {}
20
+ export class CreateActivityLogRequest extends /*#__PURE__*/Schema.Class('CreateActivityLogRequest')({
21
+ activityTypeId: ActivityTypeId,
22
+ durationMinutes: /*#__PURE__*/Schema.OptionFromNullOr(/*#__PURE__*/Schema.Int.pipe(/*#__PURE__*/Schema.between(1, 1440))),
23
+ note: /*#__PURE__*/Schema.OptionFromNullOr(Schema.String)
24
+ }) {}
25
+ export class UpdateActivityLogRequest extends /*#__PURE__*/Schema.Class('UpdateActivityLogRequest')({
26
+ activityTypeId: /*#__PURE__*/Schema.optionalWith(ActivityTypeId, {
27
+ as: 'Option'
28
+ }),
29
+ durationMinutes: /*#__PURE__*/Schema.optionalWith(/*#__PURE__*/Schema.OptionFromNullOr(/*#__PURE__*/Schema.Int.pipe(/*#__PURE__*/Schema.between(1, 1440))), {
30
+ as: 'Option'
31
+ }),
32
+ note: /*#__PURE__*/Schema.optionalWith(/*#__PURE__*/Schema.OptionFromNullOr(Schema.String), {
33
+ as: 'Option'
34
+ })
35
+ }) {}
36
+ export class ActivityTypeEntry extends /*#__PURE__*/Schema.Class('ActivityTypeEntry')({
37
+ id: ActivityTypeId,
38
+ name: Schema.String,
39
+ slug: /*#__PURE__*/Schema.OptionFromNullOr(Schema.String)
40
+ }) {}
41
+ export class ActivityTypeListResponse extends /*#__PURE__*/Schema.Class('ActivityTypeListResponse')({
42
+ activityTypes: /*#__PURE__*/Schema.Array(ActivityTypeEntry)
43
+ }) {}
44
+ export class MemberNotFound extends /*#__PURE__*/Schema.TaggedError()('ActivityLogMemberNotFound', {}, /*#__PURE__*/HttpApiSchema.annotations({
45
+ status: 404
46
+ })) {}
47
+ export class Forbidden extends /*#__PURE__*/Schema.TaggedError()('ActivityLogForbidden', {}, /*#__PURE__*/HttpApiSchema.annotations({
48
+ status: 403
49
+ })) {}
50
+ export class LogNotFound extends /*#__PURE__*/Schema.TaggedError()('ActivityLogNotFound', {}, /*#__PURE__*/HttpApiSchema.annotations({
51
+ status: 404
52
+ })) {}
53
+ export class MemberInactive extends /*#__PURE__*/Schema.TaggedError()('ActivityLogMemberInactive', {}, /*#__PURE__*/HttpApiSchema.annotations({
54
+ status: 403
55
+ })) {}
56
+ export class AutoSourceForbidden extends /*#__PURE__*/Schema.TaggedError()('ActivityLogAutoSourceForbidden', {}, /*#__PURE__*/HttpApiSchema.annotations({
57
+ status: 403
58
+ })) {}
59
+ export class ActivityLogApiGroup extends /*#__PURE__*/HttpApiGroup.make('activityLog').add(HttpApiEndpoint.get('listLogs', '/teams/:teamId/members/:memberId/activity-logs').addSuccess(ActivityLogListResponse).addError(MemberNotFound, {
60
+ status: 404
61
+ }).addError(Forbidden, {
62
+ status: 403
63
+ }).setPath(Schema.Struct({
64
+ teamId: TeamId,
65
+ memberId: TeamMemberId
66
+ })).middleware(AuthMiddleware)).add(HttpApiEndpoint.post('createLog', '/teams/:teamId/members/:memberId/activity-logs').addSuccess(ActivityLogEntry, {
67
+ status: 201
68
+ }).addError(MemberNotFound, {
69
+ status: 404
70
+ }).addError(Forbidden, {
71
+ status: 403
72
+ }).addError(MemberInactive, {
73
+ status: 403
74
+ }).setPath(Schema.Struct({
75
+ teamId: TeamId,
76
+ memberId: TeamMemberId
77
+ })).setPayload(CreateActivityLogRequest).middleware(AuthMiddleware)).add(HttpApiEndpoint.patch('updateLog', '/teams/:teamId/members/:memberId/activity-logs/:logId').addSuccess(ActivityLogEntry).addError(LogNotFound, {
78
+ status: 404
79
+ }).addError(Forbidden, {
80
+ status: 403
81
+ }).addError(MemberInactive, {
82
+ status: 403
83
+ }).addError(AutoSourceForbidden, {
84
+ status: 403
85
+ }).setPath(Schema.Struct({
86
+ teamId: TeamId,
87
+ memberId: TeamMemberId,
88
+ logId: ActivityLogId
89
+ })).setPayload(UpdateActivityLogRequest).middleware(AuthMiddleware)).add(HttpApiEndpoint.post('deleteLog', '/teams/:teamId/members/:memberId/activity-logs/:logId/delete').addSuccess(Schema.Void, {
90
+ status: 204
91
+ }).addError(LogNotFound, {
92
+ status: 404
93
+ }).addError(Forbidden, {
94
+ status: 403
95
+ }).addError(MemberInactive, {
96
+ status: 403
97
+ }).addError(AutoSourceForbidden, {
98
+ status: 403
99
+ }).setPath(Schema.Struct({
100
+ teamId: TeamId,
101
+ memberId: TeamMemberId,
102
+ logId: ActivityLogId
103
+ })).middleware(AuthMiddleware)).add(/*#__PURE__*/HttpApiEndpoint.get('listActivityTypes', '/teams/:teamId/activity-types').addSuccess(ActivityTypeListResponse).addError(Forbidden, {
104
+ status: 403
105
+ }).setPath(Schema.Struct({
106
+ teamId: TeamId
107
+ })).middleware(AuthMiddleware)) {}
108
+ //# sourceMappingURL=ActivityLogApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityLogApi.js","names":["HttpApiEndpoint","HttpApiGroup","HttpApiSchema","Schema","AuthMiddleware","ActivityLogId","ActivitySource","ActivityTypeId","TeamId","TeamMemberId","ActivityLogEntry","Class","id","activityTypeId","activityTypeName","String","loggedAt","durationMinutes","OptionFromNullOr","Int","note","source","ActivityLogListResponse","logs","Array","CreateActivityLogRequest","pipe","between","UpdateActivityLogRequest","optionalWith","as","ActivityTypeEntry","name","slug","ActivityTypeListResponse","activityTypes","MemberNotFound","TaggedError","annotations","status","Forbidden","LogNotFound","MemberInactive","AutoSourceForbidden","ActivityLogApiGroup","make","add","get","addSuccess","addError","setPath","Struct","teamId","memberId","middleware","post","setPayload","patch","logId","Void"],"sources":["../../../src/api/ActivityLogApi.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,27 @@
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
+ export class ActivityStatsResponse extends /*#__PURE__*/Schema.Class('ActivityStatsResponse')({
7
+ currentStreak: Schema.Int,
8
+ longestStreak: Schema.Int,
9
+ totalActivities: Schema.Int,
10
+ totalDurationMinutes: Schema.Int,
11
+ counts: /*#__PURE__*/Schema.Array(/*#__PURE__*/Schema.Struct({
12
+ activityTypeId: Schema.String,
13
+ activityTypeName: Schema.String,
14
+ count: Schema.Int
15
+ }))
16
+ }) {}
17
+ export class MemberNotFound extends /*#__PURE__*/Schema.TaggedError()('ActivityStatsMemberNotFound', {}, /*#__PURE__*/HttpApiSchema.annotations({
18
+ status: 404
19
+ })) {}
20
+ export class Forbidden extends /*#__PURE__*/Schema.TaggedError()('ActivityStatsForbidden', {}, /*#__PURE__*/HttpApiSchema.annotations({
21
+ status: 403
22
+ })) {}
23
+ export class ActivityStatsApiGroup extends /*#__PURE__*/HttpApiGroup.make('activityStats').add(/*#__PURE__*/HttpApiEndpoint.get('getMemberStats', '/teams/:teamId/members/:memberId/activity-stats').addSuccess(ActivityStatsResponse).addError(MemberNotFound).addError(Forbidden).setPath(Schema.Struct({
24
+ teamId: TeamId,
25
+ memberId: TeamMemberId
26
+ })).middleware(AuthMiddleware)) {}
27
+ //# sourceMappingURL=ActivityStatsApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityStatsApi.js","names":["HttpApiEndpoint","HttpApiGroup","HttpApiSchema","Schema","AuthMiddleware","TeamId","TeamMemberId","ActivityStatsResponse","Class","currentStreak","Int","longestStreak","totalActivities","totalDurationMinutes","counts","Array","Struct","activityTypeId","String","activityTypeName","count","MemberNotFound","TaggedError","annotations","status","Forbidden","ActivityStatsApiGroup","make","add","get","addSuccess","addError","setPath","teamId","memberId","middleware"],"sources":["../../../src/api/ActivityStatsApi.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,eAAe,EAAEC,YAAY,EAAEC,aAAa,QAAQ,kBAAkB;AAC/E,SAASC,MAAM,QAAQ,QAAQ;AAC/B,SAASC,cAAc,QAAQ,gBAAgB;AAC/C,SAASC,MAAM,QAAQ,mBAAmB;AAC1C,SAASC,YAAY,QAAQ,yBAAyB;AAEtD,OAAM,MAAOC,qBAAsB,sBAAQJ,MAAM,CAACK,KAAK,CACrD,uBAAuB,CACxB,CAAC;EACAC,aAAa,EAAEN,MAAM,CAACO,GAAG;EACzBC,aAAa,EAAER,MAAM,CAACO,GAAG;EACzBE,eAAe,EAAET,MAAM,CAACO,GAAG;EAC3BG,oBAAoB,EAAEV,MAAM,CAACO,GAAG;EAChCI,MAAM,eAAEX,MAAM,CAACY,KAAK,cAClBZ,MAAM,CAACa,MAAM,CAAC;IACZC,cAAc,EAAEd,MAAM,CAACe,MAAM;IAC7BC,gBAAgB,EAAEhB,MAAM,CAACe,MAAM;IAC/BE,KAAK,EAAEjB,MAAM,CAACO;GACf,CAAC;CAEL,CAAC;AAEF,OAAM,MAAOW,cAAe,sBAAQlB,MAAM,CAACmB,WAAW,EAAkB,CACtE,6BAA6B,EAC7B,EAAE,eACFpB,aAAa,CAACqB,WAAW,CAAC;EAAEC,MAAM,EAAE;AAAG,CAAE,CAAC,CAC3C;AAED,OAAM,MAAOC,SAAU,sBAAQtB,MAAM,CAACmB,WAAW,EAAa,CAC5D,wBAAwB,EACxB,EAAE,eACFpB,aAAa,CAACqB,WAAW,CAAC;EAAEC,MAAM,EAAE;AAAG,CAAE,CAAC,CAC3C;AAED,OAAM,MAAOE,qBAAsB,sBAAQzB,YAAY,CAAC0B,IAAI,CAAC,eAAe,CAAC,CAACC,GAAG,cAC/E5B,eAAe,CAAC6B,GAAG,CAAC,gBAAgB,EAAE,iDAAiD,CAAC,CACrFC,UAAU,CAACvB,qBAAqB,CAAC,CACjCwB,QAAQ,CAACV,cAAc,CAAC,CACxBU,QAAQ,CAACN,SAAS,CAAC,CACnBO,OAAO,CAAC7B,MAAM,CAACa,MAAM,CAAC;EAAEiB,MAAM,EAAE5B,MAAM;EAAE6B,QAAQ,EAAE5B;AAAY,CAAE,CAAC,CAAC,CAClE6B,UAAU,CAAC/B,cAAc,CAAC,CAC9B","ignoreList":[]}
package/dist/esm/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  export * as ApiGroup from './ApiGroup.js';
2
+ export * as ActivityLogApi from './api/ActivityLogApi.js';
3
+ export * as ActivityStatsApi from './api/ActivityStatsApi.js';
2
4
  export * as AgeThresholdApi from './api/AgeThresholdApi.js';
3
5
  export * as Auth from './api/Auth.js';
4
6
  export * as EventApi from './api/EventApi.js';
@@ -12,6 +14,9 @@ export * as RoleApi from './api/RoleApi.js';
12
14
  export * as Roster from './api/Roster.js';
13
15
  export * as TeamSettingsApi from './api/TeamSettingsApi.js';
14
16
  export * as TrainingTypeApi from './api/TrainingTypeApi.js';
17
+ export * as ActivityLog from './models/ActivityLog.js';
18
+ export * as ActivityStats from './models/ActivityStats.js';
19
+ export * as ActivityType from './models/ActivityType.js';
15
20
  export * as AgeThresholdRule from './models/AgeThresholdRule.js';
16
21
  export * as ChannelSyncEvent from './models/ChannelSyncEvent.js';
17
22
  export * as Discord from './models/Discord.js';
@@ -37,6 +42,8 @@ export * as TeamMember from './models/TeamMember.js';
37
42
  export * as TeamSettings from './models/TeamSettings.js';
38
43
  export * as TrainingType from './models/TrainingType.js';
39
44
  export * as User from './models/User.js';
45
+ export * as ActivityRpcGroup from './rpc/activity/ActivityRpcGroup.js';
46
+ export * as ActivityRpcModels from './rpc/activity/ActivityRpcModels.js';
40
47
  export * as ChannelRpcEvents from './rpc/channel/ChannelRpcEvents.js';
41
48
  export * as ChannelRpcGroup from './rpc/channel/ChannelRpcGroup.js';
42
49
  export * as ChannelRpcModels from './rpc/channel/ChannelRpcModels.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["ApiGroup","AgeThresholdApi","Auth","EventApi","EventRsvpApi","EventSeriesApi","GroupApi","ICalApi","Invite","NotificationApi","RoleApi","Roster","TeamSettingsApi","TrainingTypeApi","AgeThresholdRule","ChannelSyncEvent","Discord","DiscordChannelMapping","DiscordRoleMapping","Event","EventRsvp","EventSeries","GroupModel","ICalToken","MemberRole","Notification","OAuthConnection","Role","RoleGroup","RoleSyncEvent","RosterMemberModel","RosterModel","Session","Team","TeamInvite","TeamMember","TeamSettings","TrainingType","User","ChannelRpcEvents","ChannelRpcGroup","ChannelRpcModels","EventRpcEvents","EventRpcGroup","EventRpcModels","GuildRpcGroup","RoleRpcEvents","RoleRpcGroup","RoleRpcModels","SyncRpcs"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,QAAQ,MAAM,eAAe;AAEzC,OAAO,KAAKC,eAAe,MAAM,0BAA0B;AAE3D,OAAO,KAAKC,IAAI,MAAM,eAAe;AAErC,OAAO,KAAKC,QAAQ,MAAM,mBAAmB;AAE7C,OAAO,KAAKC,YAAY,MAAM,uBAAuB;AAErD,OAAO,KAAKC,cAAc,MAAM,yBAAyB;AAEzD,OAAO,KAAKC,QAAQ,MAAM,mBAAmB;AAE7C,OAAO,KAAKC,OAAO,MAAM,kBAAkB;AAE3C,OAAO,KAAKC,MAAM,MAAM,iBAAiB;AAEzC,OAAO,KAAKC,eAAe,MAAM,0BAA0B;AAE3D,OAAO,KAAKC,OAAO,MAAM,kBAAkB;AAE3C,OAAO,KAAKC,MAAM,MAAM,iBAAiB;AAEzC,OAAO,KAAKC,eAAe,MAAM,0BAA0B;AAE3D,OAAO,KAAKC,eAAe,MAAM,0BAA0B;AAE3D,OAAO,KAAKC,gBAAgB,MAAM,8BAA8B;AAEhE,OAAO,KAAKC,gBAAgB,MAAM,8BAA8B;AAEhE,OAAO,KAAKC,OAAO,MAAM,qBAAqB;AAE9C,OAAO,KAAKC,qBAAqB,MAAM,mCAAmC;AAE1E,OAAO,KAAKC,kBAAkB,MAAM,gCAAgC;AAEpE,OAAO,KAAKC,KAAK,MAAM,mBAAmB;AAE1C,OAAO,KAAKC,SAAS,MAAM,uBAAuB;AAElD,OAAO,KAAKC,WAAW,MAAM,yBAAyB;AAEtD,OAAO,KAAKC,UAAU,MAAM,wBAAwB;AAEpD,OAAO,KAAKC,SAAS,MAAM,uBAAuB;AAElD,OAAO,KAAKC,UAAU,MAAM,wBAAwB;AAEpD,OAAO,KAAKC,YAAY,MAAM,0BAA0B;AAExD,OAAO,KAAKC,eAAe,MAAM,6BAA6B;AAE9D,OAAO,KAAKC,IAAI,MAAM,kBAAkB;AAExC,OAAO,KAAKC,SAAS,MAAM,uBAAuB;AAElD,OAAO,KAAKC,aAAa,MAAM,2BAA2B;AAE1D,OAAO,KAAKC,iBAAiB,MAAM,+BAA+B;AAElE,OAAO,KAAKC,WAAW,MAAM,yBAAyB;AAEtD,OAAO,KAAKC,OAAO,MAAM,qBAAqB;AAE9C,OAAO,KAAKC,IAAI,MAAM,kBAAkB;AAExC,OAAO,KAAKC,UAAU,MAAM,wBAAwB;AAEpD,OAAO,KAAKC,UAAU,MAAM,wBAAwB;AAEpD,OAAO,KAAKC,YAAY,MAAM,0BAA0B;AAExD,OAAO,KAAKC,YAAY,MAAM,0BAA0B;AAExD,OAAO,KAAKC,IAAI,MAAM,kBAAkB;AACxC,OAAO,KAAKC,gBAAgB,MAAM,mCAAmC;AACrE,OAAO,KAAKC,eAAe,MAAM,kCAAkC;AACnE,OAAO,KAAKC,gBAAgB,MAAM,mCAAmC;AACrE,OAAO,KAAKC,cAAc,MAAM,+BAA+B;AAC/D,OAAO,KAAKC,aAAa,MAAM,8BAA8B;AAC7D,OAAO,KAAKC,cAAc,MAAM,+BAA+B;AAC/D,OAAO,KAAKC,aAAa,MAAM,8BAA8B;AAC7D,OAAO,KAAKC,aAAa,MAAM,6BAA6B;AAC5D,OAAO,KAAKC,YAAY,MAAM,4BAA4B;AAC1D,OAAO,KAAKC,aAAa,MAAM,6BAA6B;AAC5D,OAAO,KAAKC,QAAQ,MAAM,mBAAmB","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["ApiGroup","ActivityLogApi","ActivityStatsApi","AgeThresholdApi","Auth","EventApi","EventRsvpApi","EventSeriesApi","GroupApi","ICalApi","Invite","NotificationApi","RoleApi","Roster","TeamSettingsApi","TrainingTypeApi","ActivityLog","ActivityStats","ActivityType","AgeThresholdRule","ChannelSyncEvent","Discord","DiscordChannelMapping","DiscordRoleMapping","Event","EventRsvp","EventSeries","GroupModel","ICalToken","MemberRole","Notification","OAuthConnection","Role","RoleGroup","RoleSyncEvent","RosterMemberModel","RosterModel","Session","Team","TeamInvite","TeamMember","TeamSettings","TrainingType","User","ActivityRpcGroup","ActivityRpcModels","ChannelRpcEvents","ChannelRpcGroup","ChannelRpcModels","EventRpcEvents","EventRpcGroup","EventRpcModels","GuildRpcGroup","RoleRpcEvents","RoleRpcGroup","RoleRpcModels","SyncRpcs"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,QAAQ,MAAM,eAAe;AAEzC,OAAO,KAAKC,cAAc,MAAM,yBAAyB;AAEzD,OAAO,KAAKC,gBAAgB,MAAM,2BAA2B;AAE7D,OAAO,KAAKC,eAAe,MAAM,0BAA0B;AAE3D,OAAO,KAAKC,IAAI,MAAM,eAAe;AAErC,OAAO,KAAKC,QAAQ,MAAM,mBAAmB;AAE7C,OAAO,KAAKC,YAAY,MAAM,uBAAuB;AAErD,OAAO,KAAKC,cAAc,MAAM,yBAAyB;AAEzD,OAAO,KAAKC,QAAQ,MAAM,mBAAmB;AAE7C,OAAO,KAAKC,OAAO,MAAM,kBAAkB;AAE3C,OAAO,KAAKC,MAAM,MAAM,iBAAiB;AAEzC,OAAO,KAAKC,eAAe,MAAM,0BAA0B;AAE3D,OAAO,KAAKC,OAAO,MAAM,kBAAkB;AAE3C,OAAO,KAAKC,MAAM,MAAM,iBAAiB;AAEzC,OAAO,KAAKC,eAAe,MAAM,0BAA0B;AAE3D,OAAO,KAAKC,eAAe,MAAM,0BAA0B;AAE3D,OAAO,KAAKC,WAAW,MAAM,yBAAyB;AAEtD,OAAO,KAAKC,aAAa,MAAM,2BAA2B;AAE1D,OAAO,KAAKC,YAAY,MAAM,0BAA0B;AAExD,OAAO,KAAKC,gBAAgB,MAAM,8BAA8B;AAEhE,OAAO,KAAKC,gBAAgB,MAAM,8BAA8B;AAEhE,OAAO,KAAKC,OAAO,MAAM,qBAAqB;AAE9C,OAAO,KAAKC,qBAAqB,MAAM,mCAAmC;AAE1E,OAAO,KAAKC,kBAAkB,MAAM,gCAAgC;AAEpE,OAAO,KAAKC,KAAK,MAAM,mBAAmB;AAE1C,OAAO,KAAKC,SAAS,MAAM,uBAAuB;AAElD,OAAO,KAAKC,WAAW,MAAM,yBAAyB;AAEtD,OAAO,KAAKC,UAAU,MAAM,wBAAwB;AAEpD,OAAO,KAAKC,SAAS,MAAM,uBAAuB;AAElD,OAAO,KAAKC,UAAU,MAAM,wBAAwB;AAEpD,OAAO,KAAKC,YAAY,MAAM,0BAA0B;AAExD,OAAO,KAAKC,eAAe,MAAM,6BAA6B;AAE9D,OAAO,KAAKC,IAAI,MAAM,kBAAkB;AAExC,OAAO,KAAKC,SAAS,MAAM,uBAAuB;AAElD,OAAO,KAAKC,aAAa,MAAM,2BAA2B;AAE1D,OAAO,KAAKC,iBAAiB,MAAM,+BAA+B;AAElE,OAAO,KAAKC,WAAW,MAAM,yBAAyB;AAEtD,OAAO,KAAKC,OAAO,MAAM,qBAAqB;AAE9C,OAAO,KAAKC,IAAI,MAAM,kBAAkB;AAExC,OAAO,KAAKC,UAAU,MAAM,wBAAwB;AAEpD,OAAO,KAAKC,UAAU,MAAM,wBAAwB;AAEpD,OAAO,KAAKC,YAAY,MAAM,0BAA0B;AAExD,OAAO,KAAKC,YAAY,MAAM,0BAA0B;AAExD,OAAO,KAAKC,IAAI,MAAM,kBAAkB;AACxC,OAAO,KAAKC,gBAAgB,MAAM,oCAAoC;AACtE,OAAO,KAAKC,iBAAiB,MAAM,qCAAqC;AACxE,OAAO,KAAKC,gBAAgB,MAAM,mCAAmC;AACrE,OAAO,KAAKC,eAAe,MAAM,kCAAkC;AACnE,OAAO,KAAKC,gBAAgB,MAAM,mCAAmC;AACrE,OAAO,KAAKC,cAAc,MAAM,+BAA+B;AAC/D,OAAO,KAAKC,aAAa,MAAM,8BAA8B;AAC7D,OAAO,KAAKC,cAAc,MAAM,+BAA+B;AAC/D,OAAO,KAAKC,aAAa,MAAM,8BAA8B;AAC7D,OAAO,KAAKC,aAAa,MAAM,6BAA6B;AAC5D,OAAO,KAAKC,YAAY,MAAM,4BAA4B;AAC1D,OAAO,KAAKC,aAAa,MAAM,6BAA6B;AAC5D,OAAO,KAAKC,QAAQ,MAAM,mBAAmB","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ import { Model } from '@effect/sql';
2
+ import { Schema } from 'effect';
3
+ import { ActivityTypeId } from '../models/ActivityType.js';
4
+ import { TeamMemberId } from '../models/TeamMember.js';
5
+ export const ActivityLogId = /*#__PURE__*/Schema.String.pipe(/*#__PURE__*/Schema.brand('ActivityLogId'));
6
+ export const ActivitySource = /*#__PURE__*/Schema.Literal('manual', 'auto');
7
+ export class ActivityLog extends /*#__PURE__*/Model.Class('ActivityLog')({
8
+ id: /*#__PURE__*/Model.Generated(ActivityLogId),
9
+ team_member_id: TeamMemberId,
10
+ activity_type_id: ActivityTypeId,
11
+ logged_at: Model.DateTimeInsertFromDate,
12
+ duration_minutes: /*#__PURE__*/Schema.OptionFromNullOr(/*#__PURE__*/Schema.Int.pipe(/*#__PURE__*/Schema.between(1, 1440))),
13
+ note: /*#__PURE__*/Schema.OptionFromNullOr(Schema.String),
14
+ source: ActivitySource,
15
+ created_at: Model.DateTimeInsertFromDate
16
+ }) {}
17
+ //# sourceMappingURL=ActivityLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityLog.js","names":["Model","Schema","ActivityTypeId","TeamMemberId","ActivityLogId","String","pipe","brand","ActivitySource","Literal","ActivityLog","Class","id","Generated","team_member_id","activity_type_id","logged_at","DateTimeInsertFromDate","duration_minutes","OptionFromNullOr","Int","between","note","source","created_at"],"sources":["../../../src/models/ActivityLog.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,KAAK,QAAQ,aAAa;AACnC,SAASC,MAAM,QAAQ,QAAQ;AAC/B,SAASC,cAAc,QAAQ,2BAA2B;AAC1D,SAASC,YAAY,QAAQ,yBAAyB;AAEtD,OAAO,MAAMC,aAAa,gBAAGH,MAAM,CAACI,MAAM,CAACC,IAAI,cAACL,MAAM,CAACM,KAAK,CAAC,eAAe,CAAC,CAAC;AAG9E,OAAO,MAAMC,cAAc,gBAAGP,MAAM,CAACQ,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;AAG9D,OAAM,MAAOC,WAAY,sBAAQV,KAAK,CAACW,KAAK,CAAc,aAAa,CAAC,CAAC;EACvEC,EAAE,eAAEZ,KAAK,CAACa,SAAS,CAACT,aAAa,CAAC;EAClCU,cAAc,EAAEX,YAAY;EAC5BY,gBAAgB,EAAEb,cAAc;EAChCc,SAAS,EAAEhB,KAAK,CAACiB,sBAAsB;EACvCC,gBAAgB,eAAEjB,MAAM,CAACkB,gBAAgB,cAAClB,MAAM,CAACmB,GAAG,CAACd,IAAI,cAACL,MAAM,CAACoB,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;EACnFC,IAAI,eAAErB,MAAM,CAACkB,gBAAgB,CAAClB,MAAM,CAACI,MAAM,CAAC;EAC5CkB,MAAM,EAAEf,cAAc;EACtBgB,UAAU,EAAExB,KAAK,CAACiB;CACnB,CAAC","ignoreList":[]}
@@ -0,0 +1,111 @@
1
+ import { Option } from 'effect';
2
+ /** Calculate current and longest streaks from a list of activity dates (ISO date strings like "2026-03-25"). */
3
+ export const calculateStreaks = (dates, today) => {
4
+ const uniqueDates = [...new Set(dates)].sort();
5
+ if (uniqueDates.length === 0) return {
6
+ currentStreak: 0,
7
+ longestStreak: 0
8
+ };
9
+ // Calculate longest streak by walking sorted dates forward
10
+ let longestStreak = 1;
11
+ let currentRun = 1;
12
+ for (let i = 1; i < uniqueDates.length; i++) {
13
+ const prev = uniqueDates[i - 1];
14
+ const curr = uniqueDates[i];
15
+ if (prev !== undefined && curr !== undefined && daysBetween(prev, curr) === 1) {
16
+ currentRun++;
17
+ longestStreak = Math.max(longestStreak, currentRun);
18
+ } else {
19
+ currentRun = 1;
20
+ }
21
+ }
22
+ // Calculate current streak: walk backwards from today or yesterday
23
+ const lastDate = uniqueDates[uniqueDates.length - 1];
24
+ if (lastDate === undefined) return {
25
+ currentStreak: 0,
26
+ longestStreak: 0
27
+ };
28
+ const gapFromToday = daysBetween(lastDate, today);
29
+ // If most recent activity is more than 1 day ago, current streak is 0
30
+ if (gapFromToday > 1) return {
31
+ currentStreak: 0,
32
+ longestStreak
33
+ };
34
+ let currentStreak = 1;
35
+ for (let i = uniqueDates.length - 2; i >= 0; i--) {
36
+ const curr = uniqueDates[i];
37
+ const next = uniqueDates[i + 1];
38
+ if (curr !== undefined && next !== undefined && daysBetween(curr, next) === 1) {
39
+ currentStreak++;
40
+ } else {
41
+ break;
42
+ }
43
+ }
44
+ return {
45
+ currentStreak,
46
+ longestStreak
47
+ };
48
+ };
49
+ /** Calculate full stats from activity rows. */
50
+ export const calculateStats = (rows, today) => {
51
+ if (rows.length === 0) {
52
+ return {
53
+ currentStreak: 0,
54
+ longestStreak: 0,
55
+ totalActivities: 0,
56
+ totalDurationMinutes: 0,
57
+ counts: []
58
+ };
59
+ }
60
+ const dates = rows.map(r => r.logged_at_date);
61
+ const {
62
+ currentStreak,
63
+ longestStreak
64
+ } = calculateStreaks(dates, today);
65
+ let totalDurationMinutes = 0;
66
+ const countMap = new Map();
67
+ for (const row of rows) {
68
+ totalDurationMinutes += Option.getOrElse(row.duration_minutes, () => 0);
69
+ const existing = countMap.get(row.activity_type_id);
70
+ if (existing) {
71
+ existing.count++;
72
+ } else {
73
+ countMap.set(row.activity_type_id, {
74
+ activityTypeName: row.activity_type_name,
75
+ count: 1
76
+ });
77
+ }
78
+ }
79
+ const counts = Array.from(countMap.entries()).map(([activityTypeId, {
80
+ activityTypeName,
81
+ count
82
+ }]) => ({
83
+ activityTypeId,
84
+ activityTypeName,
85
+ count
86
+ }));
87
+ return {
88
+ currentStreak,
89
+ longestStreak,
90
+ totalActivities: rows.length,
91
+ totalDurationMinutes,
92
+ counts
93
+ };
94
+ };
95
+ /** Returns today's date as an ISO string in the Europe/Prague timezone. */
96
+ export const todayInPrague = () => {
97
+ const parts = new Intl.DateTimeFormat('en-CA', {
98
+ timeZone: 'Europe/Prague',
99
+ year: 'numeric',
100
+ month: '2-digit',
101
+ day: '2-digit'
102
+ }).formatToParts(new Date());
103
+ const get = type => parts.find(p => p.type === type)?.value ?? '';
104
+ return `${get('year')}-${get('month')}-${get('day')}`;
105
+ };
106
+ /** Returns the number of days between two ISO date strings. Always positive. Inputs must be date-only strings (UTC midnight). */
107
+ const daysBetween = (a, b) => {
108
+ const msPerDay = 86400000;
109
+ return Math.round(Math.abs(new Date(b).getTime() - new Date(a).getTime()) / msPerDay);
110
+ };
111
+ //# sourceMappingURL=ActivityStats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityStats.js","names":["Option","calculateStreaks","dates","today","uniqueDates","Set","sort","length","currentStreak","longestStreak","currentRun","i","prev","curr","undefined","daysBetween","Math","max","lastDate","gapFromToday","next","calculateStats","rows","totalActivities","totalDurationMinutes","counts","map","r","logged_at_date","countMap","Map","row","getOrElse","duration_minutes","existing","get","activity_type_id","count","set","activityTypeName","activity_type_name","Array","from","entries","activityTypeId","todayInPrague","parts","Intl","DateTimeFormat","timeZone","year","month","day","formatToParts","Date","type","find","p","value","a","b","msPerDay","round","abs","getTime"],"sources":["../../../src/models/ActivityStats.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,MAAM,QAAQ,QAAQ;AAmB/B;AACA,OAAO,MAAMC,gBAAgB,GAAGA,CAACC,KAA4B,EAAEC,KAAa,KAAkB;EAC5F,MAAMC,WAAW,GAAG,CAAC,GAAG,IAAIC,GAAG,CAACH,KAAK,CAAC,CAAC,CAACI,IAAI,EAAE;EAC9C,IAAIF,WAAW,CAACG,MAAM,KAAK,CAAC,EAAE,OAAO;IAAEC,aAAa,EAAE,CAAC;IAAEC,aAAa,EAAE;EAAC,CAAE;EAE3E;EACA,IAAIA,aAAa,GAAG,CAAC;EACrB,IAAIC,UAAU,GAAG,CAAC;EAClB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGP,WAAW,CAACG,MAAM,EAAEI,CAAC,EAAE,EAAE;IAC3C,MAAMC,IAAI,GAAGR,WAAW,CAACO,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAME,IAAI,GAAGT,WAAW,CAACO,CAAC,CAAC;IAC3B,IAAIC,IAAI,KAAKE,SAAS,IAAID,IAAI,KAAKC,SAAS,IAAIC,WAAW,CAACH,IAAI,EAAEC,IAAI,CAAC,KAAK,CAAC,EAAE;MAC7EH,UAAU,EAAE;MACZD,aAAa,GAAGO,IAAI,CAACC,GAAG,CAACR,aAAa,EAAEC,UAAU,CAAC;IACrD,CAAC,MAAM;MACLA,UAAU,GAAG,CAAC;IAChB;EACF;EAEA;EACA,MAAMQ,QAAQ,GAAGd,WAAW,CAACA,WAAW,CAACG,MAAM,GAAG,CAAC,CAAC;EACpD,IAAIW,QAAQ,KAAKJ,SAAS,EAAE,OAAO;IAAEN,aAAa,EAAE,CAAC;IAAEC,aAAa,EAAE;EAAC,CAAE;EACzE,MAAMU,YAAY,GAAGJ,WAAW,CAACG,QAAQ,EAAEf,KAAK,CAAC;EAEjD;EACA,IAAIgB,YAAY,GAAG,CAAC,EAAE,OAAO;IAAEX,aAAa,EAAE,CAAC;IAAEC;EAAa,CAAE;EAEhE,IAAID,aAAa,GAAG,CAAC;EACrB,KAAK,IAAIG,CAAC,GAAGP,WAAW,CAACG,MAAM,GAAG,CAAC,EAAEI,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;IAChD,MAAME,IAAI,GAAGT,WAAW,CAACO,CAAC,CAAC;IAC3B,MAAMS,IAAI,GAAGhB,WAAW,CAACO,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAIE,IAAI,KAAKC,SAAS,IAAIM,IAAI,KAAKN,SAAS,IAAIC,WAAW,CAACF,IAAI,EAAEO,IAAI,CAAC,KAAK,CAAC,EAAE;MAC7EZ,aAAa,EAAE;IACjB,CAAC,MAAM;MACL;IACF;EACF;EAEA,OAAO;IAAEA,aAAa;IAAEC;EAAa,CAAE;AACzC,CAAC;AAED;AACA,OAAO,MAAMY,cAAc,GAAGA,CAC5BC,IAKE,EACFnB,KAAa,KACE;EACf,IAAImB,IAAI,CAACf,MAAM,KAAK,CAAC,EAAE;IACrB,OAAO;MACLC,aAAa,EAAE,CAAC;MAChBC,aAAa,EAAE,CAAC;MAChBc,eAAe,EAAE,CAAC;MAClBC,oBAAoB,EAAE,CAAC;MACvBC,MAAM,EAAE;KACT;EACH;EAEA,MAAMvB,KAAK,GAAGoB,IAAI,CAACI,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,cAAc,CAAC;EAC/C,MAAM;IAAEpB,aAAa;IAAEC;EAAa,CAAE,GAAGR,gBAAgB,CAACC,KAAK,EAAEC,KAAK,CAAC;EAEvE,IAAIqB,oBAAoB,GAAG,CAAC;EAC5B,MAAMK,QAAQ,GAAG,IAAIC,GAAG,EAAuD;EAE/E,KAAK,MAAMC,GAAG,IAAIT,IAAI,EAAE;IACtBE,oBAAoB,IAAIxB,MAAM,CAACgC,SAAS,CAACD,GAAG,CAACE,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACvE,MAAMC,QAAQ,GAAGL,QAAQ,CAACM,GAAG,CAACJ,GAAG,CAACK,gBAAgB,CAAC;IACnD,IAAIF,QAAQ,EAAE;MACZA,QAAQ,CAACG,KAAK,EAAE;IAClB,CAAC,MAAM;MACLR,QAAQ,CAACS,GAAG,CAACP,GAAG,CAACK,gBAAgB,EAAE;QAAEG,gBAAgB,EAAER,GAAG,CAACS,kBAAkB;QAAEH,KAAK,EAAE;MAAC,CAAE,CAAC;IAC5F;EACF;EAEA,MAAMZ,MAAM,GAAGgB,KAAK,CAACC,IAAI,CAACb,QAAQ,CAACc,OAAO,EAAE,CAAC,CAACjB,GAAG,CAC/C,CAAC,CAACkB,cAAc,EAAE;IAAEL,gBAAgB;IAAEF;EAAK,CAAE,CAAC,MAAM;IAClDO,cAAc;IACdL,gBAAgB;IAChBF;GACD,CAAC,CACH;EAED,OAAO;IACL7B,aAAa;IACbC,aAAa;IACbc,eAAe,EAAED,IAAI,CAACf,MAAM;IAC5BiB,oBAAoB;IACpBC;GACD;AACH,CAAC;AAED;AACA,OAAO,MAAMoB,aAAa,GAAGA,CAAA,KAAa;EACxC,MAAMC,KAAK,GAAG,IAAIC,IAAI,CAACC,cAAc,CAAC,OAAO,EAAE;IAC7CC,QAAQ,EAAE,eAAe;IACzBC,IAAI,EAAE,SAAS;IACfC,KAAK,EAAE,SAAS;IAChBC,GAAG,EAAE;GACN,CAAC,CAACC,aAAa,CAAC,IAAIC,IAAI,EAAE,CAAC;EAE5B,MAAMnB,GAAG,GAAIoB,IAAY,IAAKT,KAAK,CAACU,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACF,IAAI,KAAKA,IAAI,CAAC,EAAEG,KAAK,IAAI,EAAE;EAC7E,OAAO,GAAGvB,GAAG,CAAC,MAAM,CAAC,IAAIA,GAAG,CAAC,OAAO,CAAC,IAAIA,GAAG,CAAC,KAAK,CAAC,EAAE;AACvD,CAAC;AAED;AACA,MAAMpB,WAAW,GAAGA,CAAC4C,CAAS,EAAEC,CAAS,KAAY;EACnD,MAAMC,QAAQ,GAAG,QAAQ;EACzB,OAAO7C,IAAI,CAAC8C,KAAK,CAAC9C,IAAI,CAAC+C,GAAG,CAAC,IAAIT,IAAI,CAACM,CAAC,CAAC,CAACI,OAAO,EAAE,GAAG,IAAIV,IAAI,CAACK,CAAC,CAAC,CAACK,OAAO,EAAE,CAAC,GAAGH,QAAQ,CAAC;AACvF,CAAC","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ import { Schema } from 'effect';
2
+ export const ActivityTypeId = /*#__PURE__*/Schema.String.pipe(/*#__PURE__*/Schema.brand('ActivityTypeId'));
3
+ export const ActivityTypeSlug = /*#__PURE__*/Schema.Literal('gym', 'running', 'stretching', 'training');
4
+ //# sourceMappingURL=ActivityType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityType.js","names":["Schema","ActivityTypeId","String","pipe","brand","ActivityTypeSlug","Literal"],"sources":["../../../src/models/ActivityType.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,MAAM,QAAQ,QAAQ;AAE/B,OAAO,MAAMC,cAAc,gBAAGD,MAAM,CAACE,MAAM,CAACC,IAAI,cAACH,MAAM,CAACI,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAGhF,OAAO,MAAMC,gBAAgB,gBAAGL,MAAM,CAACM,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,CAAC","ignoreList":[]}
@@ -1,7 +1,8 @@
1
1
  import { RpcGroup } from '@effect/rpc';
2
+ import { ActivityRpcGroup } from './activity/ActivityRpcGroup.js';
2
3
  import { ChannelRpcGroup } from './channel/ChannelRpcGroup.js';
3
4
  import { EventRpcGroup } from './event/EventRpcGroup.js';
4
5
  import { GuildRpcGroup } from './guild/GuildRpcGroup.js';
5
6
  import { RoleRpcGroup } from './role/RoleRpcGroup.js';
6
- export class SyncRpcs extends /*#__PURE__*/RpcGroup.make().merge(RoleRpcGroup, ChannelRpcGroup, GuildRpcGroup, EventRpcGroup) {}
7
+ export class SyncRpcs extends /*#__PURE__*/RpcGroup.make().merge(RoleRpcGroup, ChannelRpcGroup, GuildRpcGroup, EventRpcGroup, ActivityRpcGroup) {}
7
8
  //# sourceMappingURL=SyncRpcs.js.map
@@ -1 +1 @@
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":[]}
1
+ {"version":3,"file":"SyncRpcs.js","names":["RpcGroup","ActivityRpcGroup","ChannelRpcGroup","EventRpcGroup","GuildRpcGroup","RoleRpcGroup","SyncRpcs","make","merge"],"sources":["../../../src/rpc/SyncRpcs.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAQ,QAAQ,aAAa;AACtC,SAASC,gBAAgB,QAAQ,gCAAgC;AACjE,SAASC,eAAe,QAAQ,8BAA8B;AAC9D,SAASC,aAAa,QAAQ,0BAA0B;AACxD,SAASC,aAAa,QAAQ,0BAA0B;AACxD,SAASC,YAAY,QAAQ,wBAAwB;AAErD,OAAM,MAAOC,QAAS,sBAAQN,QAAQ,CAACO,IAAI,EAAE,CAACC,KAAK,CACjDH,YAAY,EACZH,eAAe,EACfE,aAAa,EACbD,aAAa,EACbF,gBAAgB,CACjB","ignoreList":[]}
@@ -0,0 +1,23 @@
1
+ import { Rpc, RpcGroup } from '@effect/rpc';
2
+ import { Schema } from 'effect';
3
+ import { Discord } from '../../index.js';
4
+ import { ActivityGuildNotFound, ActivityMemberNotFound, GetStatsResult, LogActivityResult } from './ActivityRpcModels.js';
5
+ export const ActivityRpcGroup = /*#__PURE__*/RpcGroup.make(Rpc.make('LogActivity', {
6
+ payload: {
7
+ guild_id: Discord.Snowflake,
8
+ discord_user_id: Discord.Snowflake,
9
+ activity_type: Schema.String,
10
+ duration_minutes: Schema.OptionFromNullOr(Schema.Int.pipe(Schema.between(1, 1440))),
11
+ note: Schema.OptionFromNullOr(Schema.String)
12
+ },
13
+ success: LogActivityResult,
14
+ error: Schema.Union(ActivityMemberNotFound, ActivityGuildNotFound)
15
+ }), Rpc.make('GetStats', {
16
+ payload: {
17
+ guild_id: Discord.Snowflake,
18
+ discord_user_id: Discord.Snowflake
19
+ },
20
+ success: GetStatsResult,
21
+ error: Schema.Union(ActivityMemberNotFound, ActivityGuildNotFound)
22
+ })).prefix('Activity/');
23
+ //# sourceMappingURL=ActivityRpcGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivityRpcGroup.js","names":["Rpc","RpcGroup","Schema","Discord","ActivityGuildNotFound","ActivityMemberNotFound","GetStatsResult","LogActivityResult","ActivityRpcGroup","make","payload","guild_id","Snowflake","discord_user_id","activity_type","String","duration_minutes","OptionFromNullOr","Int","pipe","between","note","success","error","Union","prefix"],"sources":["../../../../src/rpc/activity/ActivityRpcGroup.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,GAAG,EAAEC,QAAQ,QAAQ,aAAa;AAC3C,SAASC,MAAM,QAAQ,QAAQ;AAC/B,SAASC,OAAO,QAAQ,gBAAa;AACrC,SACEC,qBAAqB,EACrBC,sBAAsB,EACtBC,cAAc,EACdC,iBAAiB,QACZ,wBAAwB;AAE/B,OAAO,MAAMC,gBAAgB,gBAAGP,QAAQ,CAACQ,IAAI,CAC3CT,GAAG,CAACS,IAAI,CAAC,aAAa,EAAE;EACtBC,OAAO,EAAE;IACPC,QAAQ,EAAER,OAAO,CAACS,SAAS;IAC3BC,eAAe,EAAEV,OAAO,CAACS,SAAS;IAClCE,aAAa,EAAEZ,MAAM,CAACa,MAAM;IAC5BC,gBAAgB,EAAEd,MAAM,CAACe,gBAAgB,CAACf,MAAM,CAACgB,GAAG,CAACC,IAAI,CAACjB,MAAM,CAACkB,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACnFC,IAAI,EAAEnB,MAAM,CAACe,gBAAgB,CAACf,MAAM,CAACa,MAAM;GAC5C;EACDO,OAAO,EAAEf,iBAAiB;EAC1BgB,KAAK,EAAErB,MAAM,CAACsB,KAAK,CAACnB,sBAAsB,EAAED,qBAAqB;CAClE,CAAC,EACFJ,GAAG,CAACS,IAAI,CAAC,UAAU,EAAE;EACnBC,OAAO,EAAE;IACPC,QAAQ,EAAER,OAAO,CAACS,SAAS;IAC3BC,eAAe,EAAEV,OAAO,CAACS;GAC1B;EACDU,OAAO,EAAEhB,cAAc;EACvBiB,KAAK,EAAErB,MAAM,CAACsB,KAAK,CAACnB,sBAAsB,EAAED,qBAAqB;CAClE,CAAC,CACH,CAACqB,MAAM,CAAC,WAAW,CAAC","ignoreList":[]}