@sideline/domain 0.0.0 → 0.1.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 (79) hide show
  1. package/ApiGroup/package.json +6 -0
  2. package/api/Auth/package.json +6 -0
  3. package/api/Invite/package.json +6 -0
  4. package/dist/cjs/ApiGroup.js +9 -0
  5. package/dist/cjs/ApiGroup.js.map +1 -0
  6. package/dist/cjs/api/Auth.js +85 -0
  7. package/dist/cjs/api/Auth.js.map +1 -0
  8. package/dist/cjs/api/Invite.js +61 -0
  9. package/dist/cjs/api/Invite.js.map +1 -0
  10. package/dist/cjs/index.js +17 -3
  11. package/dist/cjs/models/Session.js +22 -0
  12. package/dist/cjs/models/Session.js.map +1 -0
  13. package/dist/cjs/models/Team.js +19 -0
  14. package/dist/cjs/models/Team.js.map +1 -0
  15. package/dist/cjs/models/TeamInvite.js +26 -0
  16. package/dist/cjs/models/TeamInvite.js.map +1 -0
  17. package/dist/cjs/models/TeamMember.js +21 -0
  18. package/dist/cjs/models/TeamMember.js.map +1 -0
  19. package/dist/cjs/models/User.js +33 -0
  20. package/dist/cjs/models/User.js.map +1 -0
  21. package/dist/dts/ApiGroup.d.ts +3 -0
  22. package/dist/dts/ApiGroup.d.ts.map +1 -0
  23. package/dist/dts/api/Auth.d.ts +128 -0
  24. package/dist/dts/api/Auth.d.ts.map +1 -0
  25. package/dist/dts/api/Invite.d.ts +78 -0
  26. package/dist/dts/api/Invite.d.ts.map +1 -0
  27. package/dist/dts/index.d.ts +8 -1
  28. package/dist/dts/index.d.ts.map +1 -1
  29. package/dist/dts/models/Session.d.ts +82 -0
  30. package/dist/dts/models/Session.d.ts.map +1 -0
  31. package/dist/dts/models/Team.d.ts +82 -0
  32. package/dist/dts/models/Team.d.ts.map +1 -0
  33. package/dist/dts/models/TeamInvite.d.ts +110 -0
  34. package/dist/dts/models/TeamInvite.d.ts.map +1 -0
  35. package/dist/dts/models/TeamMember.d.ts +86 -0
  36. package/dist/dts/models/TeamMember.d.ts.map +1 -0
  37. package/dist/dts/models/User.d.ts +227 -0
  38. package/dist/dts/models/User.d.ts.map +1 -0
  39. package/dist/esm/ApiGroup.js +2 -0
  40. package/dist/esm/ApiGroup.js.map +1 -0
  41. package/dist/esm/api/Auth.js +67 -0
  42. package/dist/esm/api/Auth.js.map +1 -0
  43. package/dist/esm/api/Invite.js +48 -0
  44. package/dist/esm/api/Invite.js.map +1 -0
  45. package/dist/esm/index.js +8 -1
  46. package/dist/esm/index.js.map +1 -1
  47. package/dist/esm/models/Session.js +15 -0
  48. package/dist/esm/models/Session.js.map +1 -0
  49. package/dist/esm/models/Team.js +12 -0
  50. package/dist/esm/models/Team.js.map +1 -0
  51. package/dist/esm/models/TeamInvite.js +19 -0
  52. package/dist/esm/models/TeamInvite.js.map +1 -0
  53. package/dist/esm/models/TeamMember.js +14 -0
  54. package/dist/esm/models/TeamMember.js.map +1 -0
  55. package/dist/esm/models/User.js +26 -0
  56. package/dist/esm/models/User.js.map +1 -0
  57. package/models/Session/package.json +6 -0
  58. package/models/Team/package.json +6 -0
  59. package/models/TeamInvite/package.json +6 -0
  60. package/models/TeamMember/package.json +6 -0
  61. package/models/User/package.json +6 -0
  62. package/package.json +67 -10
  63. package/src/ApiGroup.ts +14 -0
  64. package/src/api/Auth.ts +104 -0
  65. package/src/api/Invite.ts +70 -0
  66. package/src/index.ts +14 -1
  67. package/src/models/Session.ts +16 -0
  68. package/src/models/Team.ts +14 -0
  69. package/src/models/TeamInvite.ts +24 -0
  70. package/src/models/TeamMember.ts +18 -0
  71. package/src/models/User.ts +36 -0
  72. package/TodosApi/package.json +0 -6
  73. package/dist/cjs/TodosApi.js +0 -39
  74. package/dist/cjs/TodosApi.js.map +0 -1
  75. package/dist/dts/TodosApi.d.ts +0 -45
  76. package/dist/dts/TodosApi.d.ts.map +0 -1
  77. package/dist/esm/TodosApi.js +0 -29
  78. package/dist/esm/TodosApi.js.map +0 -1
  79. package/src/TodosApi.ts +0 -48
@@ -0,0 +1,67 @@
1
+ import { HttpApiEndpoint, HttpApiGroup, HttpApiMiddleware, HttpApiSchema, HttpApiSecurity } from '@effect/platform';
2
+ import { Context, Schema } from 'effect';
3
+ import { Gender, Locale, Position, Proficiency, UserId } from '../models/User.js';
4
+ export { UserId } from '../models/User.js';
5
+ export const MIN_AGE = 6;
6
+ export class CurrentUser extends /*#__PURE__*/Schema.Class('CurrentUser')({
7
+ id: UserId,
8
+ discordId: Schema.String,
9
+ discordUsername: Schema.String,
10
+ discordAvatar: /*#__PURE__*/Schema.NullOr(Schema.String),
11
+ isProfileComplete: Schema.Boolean,
12
+ name: /*#__PURE__*/Schema.NullOr(Schema.String),
13
+ birthYear: /*#__PURE__*/Schema.NullOr(Schema.Number),
14
+ gender: /*#__PURE__*/Schema.NullOr(Gender),
15
+ jerseyNumber: /*#__PURE__*/Schema.NullOr(Schema.Number),
16
+ position: /*#__PURE__*/Schema.NullOr(Position),
17
+ proficiency: /*#__PURE__*/Schema.NullOr(Proficiency),
18
+ locale: Locale
19
+ }) {}
20
+ export class UpdateLocaleRequest extends /*#__PURE__*/Schema.Class('UpdateLocaleRequest')({
21
+ locale: Locale
22
+ }) {}
23
+ export class CompleteProfileRequest extends /*#__PURE__*/Schema.Class('CompleteProfileRequest')({
24
+ name: Schema.String,
25
+ birthYear: /*#__PURE__*/Schema.Number.pipe(/*#__PURE__*/Schema.int(), /*#__PURE__*/Schema.greaterThanOrEqualTo(1900), /*#__PURE__*/Schema.filter(year => year <= new Date().getFullYear() - MIN_AGE, {
26
+ message: () => `Birth year must be at most ${new Date().getFullYear() - MIN_AGE}`
27
+ })),
28
+ gender: Gender,
29
+ jerseyNumber: /*#__PURE__*/Schema.optionalWith(/*#__PURE__*/Schema.Number.pipe(/*#__PURE__*/Schema.int(), /*#__PURE__*/Schema.between(0, 99)), {
30
+ as: 'Option'
31
+ }),
32
+ position: Position,
33
+ proficiency: Proficiency
34
+ }) {}
35
+ export class Unauthorized extends /*#__PURE__*/Schema.TaggedError()('Unauthorized', {}, /*#__PURE__*/HttpApiSchema.annotations({
36
+ status: 401
37
+ })) {}
38
+ export class CurrentUserContext extends /*#__PURE__*/Context.Tag('CurrentUserContext')() {}
39
+ export class AuthMiddleware extends /*#__PURE__*/HttpApiMiddleware.Tag()('AuthMiddleware', {
40
+ failure: Unauthorized,
41
+ provides: CurrentUserContext,
42
+ security: {
43
+ token: HttpApiSecurity.bearer
44
+ }
45
+ }) {}
46
+ export class AuthApiGroup extends /*#__PURE__*/HttpApiGroup.make('auth').add(HttpApiEndpoint.get('getLogin', '/login/url').addSuccess(Schema.URL)).add(HttpApiEndpoint.get('doLogin', '/login').addSuccess(Schema.Void, {
47
+ status: 302
48
+ })).add(HttpApiEndpoint.get('callback', '/callback').addSuccess(Schema.Void, {
49
+ status: 302
50
+ }).setUrlParams(Schema.Struct({
51
+ code: Schema.String.pipe(Schema.optionalWith({
52
+ as: 'Option'
53
+ })),
54
+ state: Schema.String.pipe(Schema.optionalWith({
55
+ as: 'Option'
56
+ })),
57
+ error: Schema.String.pipe(Schema.optionalWith({
58
+ as: 'Option'
59
+ }))
60
+ }))).add(HttpApiEndpoint.get('me', '/me').addSuccess(CurrentUser).addError(Unauthorized, {
61
+ status: 401
62
+ }).middleware(AuthMiddleware)).add(HttpApiEndpoint.post('completeProfile', '/profile').addSuccess(CurrentUser).addError(Unauthorized, {
63
+ status: 401
64
+ }).setPayload(CompleteProfileRequest).middleware(AuthMiddleware)).add(HttpApiEndpoint.patch('updateLocale', '/me/locale').addSuccess(CurrentUser).addError(Unauthorized, {
65
+ status: 401
66
+ }).setPayload(UpdateLocaleRequest).middleware(AuthMiddleware)).prefix('/auth') {}
67
+ //# sourceMappingURL=Auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Auth.js","names":["HttpApiEndpoint","HttpApiGroup","HttpApiMiddleware","HttpApiSchema","HttpApiSecurity","Context","Schema","Gender","Locale","Position","Proficiency","UserId","MIN_AGE","CurrentUser","Class","id","discordId","String","discordUsername","discordAvatar","NullOr","isProfileComplete","Boolean","name","birthYear","Number","gender","jerseyNumber","position","proficiency","locale","UpdateLocaleRequest","CompleteProfileRequest","pipe","int","greaterThanOrEqualTo","filter","year","Date","getFullYear","message","optionalWith","between","as","Unauthorized","TaggedError","annotations","status","CurrentUserContext","Tag","AuthMiddleware","failure","provides","security","token","bearer","AuthApiGroup","make","add","get","addSuccess","URL","Void","setUrlParams","Struct","code","state","error","addError","middleware","post","setPayload","patch","prefix"],"sources":["../../../src/api/Auth.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,48 @@
1
+ import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from '@effect/platform';
2
+ import { Schema } from 'effect';
3
+ import { TeamId } from '../models/Team.js';
4
+ import { TeamRole } from '../models/TeamMember.js';
5
+ import { AuthMiddleware } from './Auth.js';
6
+ export class InviteInfo extends /*#__PURE__*/Schema.Class('InviteInfo')({
7
+ teamName: Schema.String,
8
+ teamId: TeamId,
9
+ code: Schema.String
10
+ }) {}
11
+ export class JoinResult extends /*#__PURE__*/Schema.Class('JoinResult')({
12
+ teamId: TeamId,
13
+ role: TeamRole,
14
+ isProfileComplete: Schema.Boolean
15
+ }) {}
16
+ export class InviteCode extends /*#__PURE__*/Schema.Class('InviteCode')({
17
+ code: Schema.String,
18
+ active: Schema.Boolean
19
+ }) {}
20
+ export class InviteNotFound extends /*#__PURE__*/Schema.TaggedError()('InviteNotFound', {}, /*#__PURE__*/HttpApiSchema.annotations({
21
+ status: 404
22
+ })) {}
23
+ export class AlreadyMember extends /*#__PURE__*/Schema.TaggedError()('AlreadyMember', {}, /*#__PURE__*/HttpApiSchema.annotations({
24
+ status: 409
25
+ })) {}
26
+ export class Forbidden extends /*#__PURE__*/Schema.TaggedError()('Forbidden', {}, /*#__PURE__*/HttpApiSchema.annotations({
27
+ status: 403
28
+ })) {}
29
+ export class InviteApiGroup extends /*#__PURE__*/HttpApiGroup.make('invite').add(HttpApiEndpoint.get('getInvite', '/invite/:code').addSuccess(InviteInfo).addError(InviteNotFound, {
30
+ status: 404
31
+ }).setPath(Schema.Struct({
32
+ code: Schema.String
33
+ }))).add(HttpApiEndpoint.post('joinViaInvite', '/invite/:code/join').addSuccess(JoinResult).addError(InviteNotFound, {
34
+ status: 404
35
+ }).addError(AlreadyMember, {
36
+ status: 409
37
+ }).setPath(Schema.Struct({
38
+ code: Schema.String
39
+ })).middleware(AuthMiddleware)).add(HttpApiEndpoint.post('regenerateInvite', '/teams/:teamId/invite/regenerate').addSuccess(InviteCode).addError(Forbidden, {
40
+ status: 403
41
+ }).setPath(Schema.Struct({
42
+ teamId: TeamId
43
+ })).middleware(AuthMiddleware)).add(/*#__PURE__*/HttpApiEndpoint.del('disableInvite', '/teams/:teamId/invite').addSuccess(Schema.Void).addError(Forbidden, {
44
+ status: 403
45
+ }).setPath(Schema.Struct({
46
+ teamId: TeamId
47
+ })).middleware(AuthMiddleware)) {}
48
+ //# sourceMappingURL=Invite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Invite.js","names":["HttpApiEndpoint","HttpApiGroup","HttpApiSchema","Schema","TeamId","TeamRole","AuthMiddleware","InviteInfo","Class","teamName","String","teamId","code","JoinResult","role","isProfileComplete","Boolean","InviteCode","active","InviteNotFound","TaggedError","annotations","status","AlreadyMember","Forbidden","InviteApiGroup","make","add","get","addSuccess","addError","setPath","Struct","post","middleware","del","Void"],"sources":["../../../src/api/Invite.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/dist/esm/index.js CHANGED
@@ -1,2 +1,9 @@
1
- export * as TodosApi from "./TodosApi.js";
1
+ export * as ApiGroup from './ApiGroup.js';
2
+ export * as Auth from './api/Auth.js';
3
+ export * as Invite from './api/Invite.js';
4
+ export * as Session from './models/Session.js';
5
+ export * as Team from './models/Team.js';
6
+ export * as TeamInvite from './models/TeamInvite.js';
7
+ export * as TeamMember from './models/TeamMember.js';
8
+ export * as User from './models/User.js';
2
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["TodosApi"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AACA,OAAO,KAAKA,QAAQ,MAAM,eAAe","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["ApiGroup","Auth","Invite","Session","Team","TeamInvite","TeamMember","User"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,QAAQ,MAAM,eAAe;AAEzC,OAAO,KAAKC,IAAI,MAAM,eAAe;AAErC,OAAO,KAAKC,MAAM,MAAM,iBAAiB;AAEzC,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,IAAI,MAAM,kBAAkB","ignoreList":[]}
@@ -0,0 +1,15 @@
1
+ import { Model } from '@effect/sql';
2
+ import { DateTime, Schema } from 'effect';
3
+ import { UserId } from './User.js';
4
+ const DateTimeFromDate = /*#__PURE__*/Schema.transform(Schema.DateFromSelf, Schema.DateTimeUtcFromSelf, {
5
+ decode: date => DateTime.unsafeFromDate(date),
6
+ encode: dt => new Date(DateTime.toEpochMillis(dt))
7
+ });
8
+ export class Session extends /*#__PURE__*/Model.Class('Session')({
9
+ id: /*#__PURE__*/Model.Generated(Schema.String),
10
+ user_id: UserId,
11
+ token: Schema.String,
12
+ expires_at: DateTimeFromDate,
13
+ created_at: Model.DateTimeInsertFromDate
14
+ }) {}
15
+ //# sourceMappingURL=Session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Session.js","names":["Model","DateTime","Schema","UserId","DateTimeFromDate","transform","DateFromSelf","DateTimeUtcFromSelf","decode","date","unsafeFromDate","encode","dt","Date","toEpochMillis","Session","Class","id","Generated","String","user_id","token","expires_at","created_at","DateTimeInsertFromDate"],"sources":["../../../src/models/Session.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,KAAK,QAAQ,aAAa;AACnC,SAASC,QAAQ,EAAEC,MAAM,QAAQ,QAAQ;AACzC,SAASC,MAAM,QAAQ,WAAW;AAElC,MAAMC,gBAAgB,gBAAGF,MAAM,CAACG,SAAS,CAACH,MAAM,CAACI,YAAY,EAAEJ,MAAM,CAACK,mBAAmB,EAAE;EACzFC,MAAM,EAAGC,IAAI,IAAKR,QAAQ,CAACS,cAAc,CAACD,IAAI,CAAC;EAC/CE,MAAM,EAAGC,EAAE,IAAK,IAAIC,IAAI,CAACZ,QAAQ,CAACa,aAAa,CAACF,EAAE,CAAC;CACpD,CAAC;AAEF,OAAM,MAAOG,OAAQ,sBAAQf,KAAK,CAACgB,KAAK,CAAU,SAAS,CAAC,CAAC;EAC3DC,EAAE,eAAEjB,KAAK,CAACkB,SAAS,CAAChB,MAAM,CAACiB,MAAM,CAAC;EAClCC,OAAO,EAAEjB,MAAM;EACfkB,KAAK,EAAEnB,MAAM,CAACiB,MAAM;EACpBG,UAAU,EAAElB,gBAAgB;EAC5BmB,UAAU,EAAEvB,KAAK,CAACwB;CACnB,CAAC","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ import { Model } from '@effect/sql';
2
+ import { Schema } from 'effect';
3
+ import { UserId } from './User.js';
4
+ export const TeamId = /*#__PURE__*/Schema.String.pipe(/*#__PURE__*/Schema.brand('TeamId'));
5
+ export class Team extends /*#__PURE__*/Model.Class('Team')({
6
+ id: /*#__PURE__*/Model.Generated(TeamId),
7
+ name: Schema.String,
8
+ created_by: UserId,
9
+ created_at: Model.DateTimeInsertFromDate,
10
+ updated_at: Model.DateTimeUpdateFromDate
11
+ }) {}
12
+ //# sourceMappingURL=Team.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Team.js","names":["Model","Schema","UserId","TeamId","String","pipe","brand","Team","Class","id","Generated","name","created_by","created_at","DateTimeInsertFromDate","updated_at","DateTimeUpdateFromDate"],"sources":["../../../src/models/Team.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,KAAK,QAAQ,aAAa;AACnC,SAASC,MAAM,QAAQ,QAAQ;AAC/B,SAASC,MAAM,QAAQ,WAAW;AAElC,OAAO,MAAMC,MAAM,gBAAGF,MAAM,CAACG,MAAM,CAACC,IAAI,cAACJ,MAAM,CAACK,KAAK,CAAC,QAAQ,CAAC,CAAC;AAGhE,OAAM,MAAOC,IAAK,sBAAQP,KAAK,CAACQ,KAAK,CAAO,MAAM,CAAC,CAAC;EAClDC,EAAE,eAAET,KAAK,CAACU,SAAS,CAACP,MAAM,CAAC;EAC3BQ,IAAI,EAAEV,MAAM,CAACG,MAAM;EACnBQ,UAAU,EAAEV,MAAM;EAClBW,UAAU,EAAEb,KAAK,CAACc,sBAAsB;EACxCC,UAAU,EAAEf,KAAK,CAACgB;CACnB,CAAC","ignoreList":[]}
@@ -0,0 +1,19 @@
1
+ import { Model } from '@effect/sql';
2
+ import { DateTime, Schema } from 'effect';
3
+ import { TeamId } from './Team.js';
4
+ import { UserId } from './User.js';
5
+ export const TeamInviteId = /*#__PURE__*/Schema.String.pipe(/*#__PURE__*/Schema.brand('TeamInviteId'));
6
+ const NullableDateTimeFromDate = /*#__PURE__*/Schema.NullOr(/*#__PURE__*/Schema.transform(Schema.DateFromSelf, Schema.DateTimeUtcFromSelf, {
7
+ decode: date => DateTime.unsafeFromDate(date),
8
+ encode: dt => new Date(DateTime.toEpochMillis(dt))
9
+ }));
10
+ export class TeamInvite extends /*#__PURE__*/Model.Class('TeamInvite')({
11
+ id: /*#__PURE__*/Model.Generated(TeamInviteId),
12
+ team_id: TeamId,
13
+ code: Schema.String,
14
+ active: Schema.Boolean,
15
+ created_by: UserId,
16
+ created_at: Model.DateTimeInsertFromDate,
17
+ expires_at: NullableDateTimeFromDate
18
+ }) {}
19
+ //# sourceMappingURL=TeamInvite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TeamInvite.js","names":["Model","DateTime","Schema","TeamId","UserId","TeamInviteId","String","pipe","brand","NullableDateTimeFromDate","NullOr","transform","DateFromSelf","DateTimeUtcFromSelf","decode","date","unsafeFromDate","encode","dt","Date","toEpochMillis","TeamInvite","Class","id","Generated","team_id","code","active","Boolean","created_by","created_at","DateTimeInsertFromDate","expires_at"],"sources":["../../../src/models/TeamInvite.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,KAAK,QAAQ,aAAa;AACnC,SAASC,QAAQ,EAAEC,MAAM,QAAQ,QAAQ;AACzC,SAASC,MAAM,QAAQ,WAAW;AAClC,SAASC,MAAM,QAAQ,WAAW;AAElC,OAAO,MAAMC,YAAY,gBAAGH,MAAM,CAACI,MAAM,CAACC,IAAI,cAACL,MAAM,CAACM,KAAK,CAAC,cAAc,CAAC,CAAC;AAG5E,MAAMC,wBAAwB,gBAAGP,MAAM,CAACQ,MAAM,cAC5CR,MAAM,CAACS,SAAS,CAACT,MAAM,CAACU,YAAY,EAAEV,MAAM,CAACW,mBAAmB,EAAE;EAChEC,MAAM,EAAGC,IAAI,IAAKd,QAAQ,CAACe,cAAc,CAACD,IAAI,CAAC;EAC/CE,MAAM,EAAGC,EAAE,IAAK,IAAIC,IAAI,CAAClB,QAAQ,CAACmB,aAAa,CAACF,EAAE,CAAC;CACpD,CAAC,CACH;AAED,OAAM,MAAOG,UAAW,sBAAQrB,KAAK,CAACsB,KAAK,CAAa,YAAY,CAAC,CAAC;EACpEC,EAAE,eAAEvB,KAAK,CAACwB,SAAS,CAACnB,YAAY,CAAC;EACjCoB,OAAO,EAAEtB,MAAM;EACfuB,IAAI,EAAExB,MAAM,CAACI,MAAM;EACnBqB,MAAM,EAAEzB,MAAM,CAAC0B,OAAO;EACtBC,UAAU,EAAEzB,MAAM;EAClB0B,UAAU,EAAE9B,KAAK,CAAC+B,sBAAsB;EACxCC,UAAU,EAAEvB;CACb,CAAC","ignoreList":[]}
@@ -0,0 +1,14 @@
1
+ import { Model } from '@effect/sql';
2
+ import { Schema } from 'effect';
3
+ import { TeamId } from './Team.js';
4
+ import { UserId } from './User.js';
5
+ export const TeamMemberId = /*#__PURE__*/Schema.String.pipe(/*#__PURE__*/Schema.brand('TeamMemberId'));
6
+ export const TeamRole = /*#__PURE__*/Schema.Literal('admin', 'member');
7
+ export class TeamMember extends /*#__PURE__*/Model.Class('TeamMember')({
8
+ id: /*#__PURE__*/Model.Generated(TeamMemberId),
9
+ team_id: TeamId,
10
+ user_id: UserId,
11
+ role: TeamRole,
12
+ joined_at: Model.DateTimeInsertFromDate
13
+ }) {}
14
+ //# sourceMappingURL=TeamMember.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TeamMember.js","names":["Model","Schema","TeamId","UserId","TeamMemberId","String","pipe","brand","TeamRole","Literal","TeamMember","Class","id","Generated","team_id","user_id","role","joined_at","DateTimeInsertFromDate"],"sources":["../../../src/models/TeamMember.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,KAAK,QAAQ,aAAa;AACnC,SAASC,MAAM,QAAQ,QAAQ;AAC/B,SAASC,MAAM,QAAQ,WAAW;AAClC,SAASC,MAAM,QAAQ,WAAW;AAElC,OAAO,MAAMC,YAAY,gBAAGH,MAAM,CAACI,MAAM,CAACC,IAAI,cAACL,MAAM,CAACM,KAAK,CAAC,cAAc,CAAC,CAAC;AAG5E,OAAO,MAAMC,QAAQ,gBAAGP,MAAM,CAACQ,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC;AAGzD,OAAM,MAAOC,UAAW,sBAAQV,KAAK,CAACW,KAAK,CAAa,YAAY,CAAC,CAAC;EACpEC,EAAE,eAAEZ,KAAK,CAACa,SAAS,CAACT,YAAY,CAAC;EACjCU,OAAO,EAAEZ,MAAM;EACfa,OAAO,EAAEZ,MAAM;EACfa,IAAI,EAAER,QAAQ;EACdS,SAAS,EAAEjB,KAAK,CAACkB;CAClB,CAAC","ignoreList":[]}
@@ -0,0 +1,26 @@
1
+ import { Model } from '@effect/sql';
2
+ import { Schema } from 'effect';
3
+ export const UserId = /*#__PURE__*/Schema.String.pipe(/*#__PURE__*/Schema.brand('UserId'));
4
+ export const Gender = /*#__PURE__*/Schema.Literal('male', 'female', 'other');
5
+ export const Position = /*#__PURE__*/Schema.Literal('goalkeeper', 'defender', 'midfielder', 'forward');
6
+ export const Proficiency = /*#__PURE__*/Schema.Literal('beginner', 'intermediate', 'advanced', 'pro');
7
+ export const Locale = /*#__PURE__*/Schema.Literal('en', 'cs');
8
+ export class User extends /*#__PURE__*/Model.Class('User')({
9
+ id: /*#__PURE__*/Model.Generated(UserId),
10
+ discord_id: Schema.String,
11
+ discord_username: Schema.String,
12
+ discord_avatar: /*#__PURE__*/Schema.NullOr(Schema.String),
13
+ discord_access_token: /*#__PURE__*/Model.Sensitive(Schema.String),
14
+ discord_refresh_token: /*#__PURE__*/Model.Sensitive(/*#__PURE__*/Schema.NullOr(Schema.String)),
15
+ name: /*#__PURE__*/Schema.NullOr(Schema.String),
16
+ birth_year: /*#__PURE__*/Schema.NullOr(Schema.Number),
17
+ gender: /*#__PURE__*/Schema.NullOr(Gender),
18
+ jersey_number: /*#__PURE__*/Schema.NullOr(Schema.Number),
19
+ position: /*#__PURE__*/Schema.NullOr(Position),
20
+ proficiency: /*#__PURE__*/Schema.NullOr(Proficiency),
21
+ locale: Locale,
22
+ created_at: Model.DateTimeInsertFromDate,
23
+ is_profile_complete: Schema.Boolean,
24
+ updated_at: Model.DateTimeUpdateFromDate
25
+ }) {}
26
+ //# sourceMappingURL=User.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"User.js","names":["Model","Schema","UserId","String","pipe","brand","Gender","Literal","Position","Proficiency","Locale","User","Class","id","Generated","discord_id","discord_username","discord_avatar","NullOr","discord_access_token","Sensitive","discord_refresh_token","name","birth_year","Number","gender","jersey_number","position","proficiency","locale","created_at","DateTimeInsertFromDate","is_profile_complete","Boolean","updated_at","DateTimeUpdateFromDate"],"sources":["../../../src/models/User.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,KAAK,QAAQ,aAAa;AACnC,SAASC,MAAM,QAAQ,QAAQ;AAE/B,OAAO,MAAMC,MAAM,gBAAGD,MAAM,CAACE,MAAM,CAACC,IAAI,cAACH,MAAM,CAACI,KAAK,CAAC,QAAQ,CAAC,CAAC;AAGhE,OAAO,MAAMC,MAAM,gBAAGL,MAAM,CAACM,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC;AAG/D,OAAO,MAAMC,QAAQ,gBAAGP,MAAM,CAACM,OAAO,CAAC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,CAAC;AAGzF,OAAO,MAAME,WAAW,gBAAGR,MAAM,CAACM,OAAO,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,KAAK,CAAC;AAGxF,OAAO,MAAMG,MAAM,gBAAGT,MAAM,CAACM,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;AAGhD,OAAM,MAAOI,IAAK,sBAAQX,KAAK,CAACY,KAAK,CAAO,MAAM,CAAC,CAAC;EAClDC,EAAE,eAAEb,KAAK,CAACc,SAAS,CAACZ,MAAM,CAAC;EAC3Ba,UAAU,EAAEd,MAAM,CAACE,MAAM;EACzBa,gBAAgB,EAAEf,MAAM,CAACE,MAAM;EAC/Bc,cAAc,eAAEhB,MAAM,CAACiB,MAAM,CAACjB,MAAM,CAACE,MAAM,CAAC;EAC5CgB,oBAAoB,eAAEnB,KAAK,CAACoB,SAAS,CAACnB,MAAM,CAACE,MAAM,CAAC;EACpDkB,qBAAqB,eAAErB,KAAK,CAACoB,SAAS,cAACnB,MAAM,CAACiB,MAAM,CAACjB,MAAM,CAACE,MAAM,CAAC,CAAC;EACpEmB,IAAI,eAAErB,MAAM,CAACiB,MAAM,CAACjB,MAAM,CAACE,MAAM,CAAC;EAClCoB,UAAU,eAAEtB,MAAM,CAACiB,MAAM,CAACjB,MAAM,CAACuB,MAAM,CAAC;EACxCC,MAAM,eAAExB,MAAM,CAACiB,MAAM,CAACZ,MAAM,CAAC;EAC7BoB,aAAa,eAAEzB,MAAM,CAACiB,MAAM,CAACjB,MAAM,CAACuB,MAAM,CAAC;EAC3CG,QAAQ,eAAE1B,MAAM,CAACiB,MAAM,CAACV,QAAQ,CAAC;EACjCoB,WAAW,eAAE3B,MAAM,CAACiB,MAAM,CAACT,WAAW,CAAC;EACvCoB,MAAM,EAAEnB,MAAM;EACdoB,UAAU,EAAE9B,KAAK,CAAC+B,sBAAsB;EACxCC,mBAAmB,EAAE/B,MAAM,CAACgC,OAAO;EACnCC,UAAU,EAAElC,KAAK,CAACmC;CACnB,CAAC","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/cjs/models/Session.js",
3
+ "module": "../../dist/esm/models/Session.js",
4
+ "types": "../../dist/dts/models/Session.d.ts",
5
+ "sideEffects": []
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/cjs/models/Team.js",
3
+ "module": "../../dist/esm/models/Team.js",
4
+ "types": "../../dist/dts/models/Team.d.ts",
5
+ "sideEffects": []
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/cjs/models/TeamInvite.js",
3
+ "module": "../../dist/esm/models/TeamInvite.js",
4
+ "types": "../../dist/dts/models/TeamInvite.d.ts",
5
+ "sideEffects": []
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/cjs/models/TeamMember.js",
3
+ "module": "../../dist/esm/models/TeamMember.js",
4
+ "types": "../../dist/dts/models/TeamMember.d.ts",
5
+ "sideEffects": []
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/cjs/models/User.js",
3
+ "module": "../../dist/esm/models/User.js",
4
+ "types": "../../dist/dts/models/User.d.ts",
5
+ "sideEffects": []
6
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sideline/domain",
3
- "version": "0.0.0",
3
+ "version": "0.1.0",
4
4
  "description": "The domain template",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -10,9 +10,10 @@
10
10
  },
11
11
  "sideEffects": [],
12
12
  "dependencies": {
13
- "@effect/platform": "latest",
14
- "@effect/sql": "latest",
15
- "effect": "latest"
13
+ "@effect/experimental": "0.58.0",
14
+ "@effect/platform": "0.94.5",
15
+ "@effect/sql": "0.49.0",
16
+ "effect": "3.19.18"
16
17
  },
17
18
  "main": "./dist/cjs/index.js",
18
19
  "module": "./dist/esm/index.js",
@@ -24,16 +25,72 @@
24
25
  "import": "./dist/esm/index.js",
25
26
  "default": "./dist/cjs/index.js"
26
27
  },
27
- "./TodosApi": {
28
- "types": "./dist/dts/TodosApi.d.ts",
29
- "import": "./dist/esm/TodosApi.js",
30
- "default": "./dist/cjs/TodosApi.js"
28
+ "./ApiGroup": {
29
+ "types": "./dist/dts/ApiGroup.d.ts",
30
+ "import": "./dist/esm/ApiGroup.js",
31
+ "default": "./dist/cjs/ApiGroup.js"
32
+ },
33
+ "./api/Auth": {
34
+ "types": "./dist/dts/api/Auth.d.ts",
35
+ "import": "./dist/esm/api/Auth.js",
36
+ "default": "./dist/cjs/api/Auth.js"
37
+ },
38
+ "./api/Invite": {
39
+ "types": "./dist/dts/api/Invite.d.ts",
40
+ "import": "./dist/esm/api/Invite.js",
41
+ "default": "./dist/cjs/api/Invite.js"
42
+ },
43
+ "./models/Session": {
44
+ "types": "./dist/dts/models/Session.d.ts",
45
+ "import": "./dist/esm/models/Session.js",
46
+ "default": "./dist/cjs/models/Session.js"
47
+ },
48
+ "./models/Team": {
49
+ "types": "./dist/dts/models/Team.d.ts",
50
+ "import": "./dist/esm/models/Team.js",
51
+ "default": "./dist/cjs/models/Team.js"
52
+ },
53
+ "./models/TeamInvite": {
54
+ "types": "./dist/dts/models/TeamInvite.d.ts",
55
+ "import": "./dist/esm/models/TeamInvite.js",
56
+ "default": "./dist/cjs/models/TeamInvite.js"
57
+ },
58
+ "./models/TeamMember": {
59
+ "types": "./dist/dts/models/TeamMember.d.ts",
60
+ "import": "./dist/esm/models/TeamMember.js",
61
+ "default": "./dist/cjs/models/TeamMember.js"
62
+ },
63
+ "./models/User": {
64
+ "types": "./dist/dts/models/User.d.ts",
65
+ "import": "./dist/esm/models/User.js",
66
+ "default": "./dist/cjs/models/User.js"
31
67
  }
32
68
  },
33
69
  "typesVersions": {
34
70
  "*": {
35
- "TodosApi": [
36
- "./dist/dts/TodosApi.d.ts"
71
+ "ApiGroup": [
72
+ "./dist/dts/ApiGroup.d.ts"
73
+ ],
74
+ "api/Auth": [
75
+ "./dist/dts/api/Auth.d.ts"
76
+ ],
77
+ "api/Invite": [
78
+ "./dist/dts/api/Invite.d.ts"
79
+ ],
80
+ "models/Session": [
81
+ "./dist/dts/models/Session.d.ts"
82
+ ],
83
+ "models/Team": [
84
+ "./dist/dts/models/Team.d.ts"
85
+ ],
86
+ "models/TeamInvite": [
87
+ "./dist/dts/models/TeamInvite.d.ts"
88
+ ],
89
+ "models/TeamMember": [
90
+ "./dist/dts/models/TeamMember.d.ts"
91
+ ],
92
+ "models/User": [
93
+ "./dist/dts/models/User.d.ts"
37
94
  ]
38
95
  }
39
96
  }
@@ -0,0 +1,14 @@
1
+ import type { HttpApiEndpoint, HttpApiError, HttpApiGroup } from '@effect/platform';
2
+
3
+ export const getEndpoint =
4
+ <
5
+ Id extends string,
6
+ Endpoints extends HttpApiEndpoint.HttpApiEndpoint.Any = never,
7
+ Error = HttpApiError.HttpApiDecodeError,
8
+ R = never,
9
+ TopLevel extends true | false = false,
10
+ >(
11
+ key: Endpoints['name'],
12
+ ) =>
13
+ (group: HttpApiGroup.HttpApiGroup<Id, Endpoints, Error, R, TopLevel>) =>
14
+ group.endpoints[key];
@@ -0,0 +1,104 @@
1
+ import {
2
+ HttpApiEndpoint,
3
+ HttpApiGroup,
4
+ HttpApiMiddleware,
5
+ HttpApiSchema,
6
+ HttpApiSecurity,
7
+ } from '@effect/platform';
8
+ import { Context, Schema } from 'effect';
9
+ import { Gender, Locale, Position, Proficiency, UserId } from '../models/User.js';
10
+
11
+ export { UserId } from '../models/User.js';
12
+
13
+ export const MIN_AGE = 6;
14
+
15
+ export class CurrentUser extends Schema.Class<CurrentUser>('CurrentUser')({
16
+ id: UserId,
17
+ discordId: Schema.String,
18
+ discordUsername: Schema.String,
19
+ discordAvatar: Schema.NullOr(Schema.String),
20
+ isProfileComplete: Schema.Boolean,
21
+ name: Schema.NullOr(Schema.String),
22
+ birthYear: Schema.NullOr(Schema.Number),
23
+ gender: Schema.NullOr(Gender),
24
+ jerseyNumber: Schema.NullOr(Schema.Number),
25
+ position: Schema.NullOr(Position),
26
+ proficiency: Schema.NullOr(Proficiency),
27
+ locale: Locale,
28
+ }) {}
29
+
30
+ export class UpdateLocaleRequest extends Schema.Class<UpdateLocaleRequest>('UpdateLocaleRequest')({
31
+ locale: Locale,
32
+ }) {}
33
+
34
+ export class CompleteProfileRequest extends Schema.Class<CompleteProfileRequest>(
35
+ 'CompleteProfileRequest',
36
+ )({
37
+ name: Schema.String,
38
+ birthYear: Schema.Number.pipe(
39
+ Schema.int(),
40
+ Schema.greaterThanOrEqualTo(1900),
41
+ Schema.filter((year) => year <= new Date().getFullYear() - MIN_AGE, {
42
+ message: () => `Birth year must be at most ${new Date().getFullYear() - MIN_AGE}`,
43
+ }),
44
+ ),
45
+ gender: Gender,
46
+ jerseyNumber: Schema.optionalWith(Schema.Number.pipe(Schema.int(), Schema.between(0, 99)), {
47
+ as: 'Option',
48
+ }),
49
+ position: Position,
50
+ proficiency: Proficiency,
51
+ }) {}
52
+
53
+ export class Unauthorized extends Schema.TaggedError<Unauthorized>()(
54
+ 'Unauthorized',
55
+ {},
56
+ HttpApiSchema.annotations({ status: 401 }),
57
+ ) {}
58
+
59
+ export class CurrentUserContext extends Context.Tag('CurrentUserContext')<
60
+ CurrentUserContext,
61
+ CurrentUser
62
+ >() {}
63
+
64
+ export class AuthMiddleware extends HttpApiMiddleware.Tag<AuthMiddleware>()('AuthMiddleware', {
65
+ failure: Unauthorized,
66
+ provides: CurrentUserContext,
67
+ security: { token: HttpApiSecurity.bearer },
68
+ }) {}
69
+
70
+ export class AuthApiGroup extends HttpApiGroup.make('auth')
71
+ .add(HttpApiEndpoint.get('getLogin', '/login/url').addSuccess(Schema.URL))
72
+ .add(HttpApiEndpoint.get('doLogin', '/login').addSuccess(Schema.Void, { status: 302 }))
73
+ .add(
74
+ HttpApiEndpoint.get('callback', '/callback')
75
+ .addSuccess(Schema.Void, { status: 302 })
76
+ .setUrlParams(
77
+ Schema.Struct({
78
+ code: Schema.String.pipe(Schema.optionalWith({ as: 'Option' })),
79
+ state: Schema.String.pipe(Schema.optionalWith({ as: 'Option' })),
80
+ error: Schema.String.pipe(Schema.optionalWith({ as: 'Option' })),
81
+ }),
82
+ ),
83
+ )
84
+ .add(
85
+ HttpApiEndpoint.get('me', '/me')
86
+ .addSuccess(CurrentUser)
87
+ .addError(Unauthorized, { status: 401 })
88
+ .middleware(AuthMiddleware),
89
+ )
90
+ .add(
91
+ HttpApiEndpoint.post('completeProfile', '/profile')
92
+ .addSuccess(CurrentUser)
93
+ .addError(Unauthorized, { status: 401 })
94
+ .setPayload(CompleteProfileRequest)
95
+ .middleware(AuthMiddleware),
96
+ )
97
+ .add(
98
+ HttpApiEndpoint.patch('updateLocale', '/me/locale')
99
+ .addSuccess(CurrentUser)
100
+ .addError(Unauthorized, { status: 401 })
101
+ .setPayload(UpdateLocaleRequest)
102
+ .middleware(AuthMiddleware),
103
+ )
104
+ .prefix('/auth') {}
@@ -0,0 +1,70 @@
1
+ import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema } from '@effect/platform';
2
+ import { Schema } from 'effect';
3
+ import { TeamId } from '../models/Team.js';
4
+ import { TeamRole } from '../models/TeamMember.js';
5
+ import { AuthMiddleware } from './Auth.js';
6
+
7
+ export class InviteInfo extends Schema.Class<InviteInfo>('InviteInfo')({
8
+ teamName: Schema.String,
9
+ teamId: TeamId,
10
+ code: Schema.String,
11
+ }) {}
12
+
13
+ export class JoinResult extends Schema.Class<JoinResult>('JoinResult')({
14
+ teamId: TeamId,
15
+ role: TeamRole,
16
+ isProfileComplete: Schema.Boolean,
17
+ }) {}
18
+
19
+ export class InviteCode extends Schema.Class<InviteCode>('InviteCode')({
20
+ code: Schema.String,
21
+ active: Schema.Boolean,
22
+ }) {}
23
+
24
+ export class InviteNotFound extends Schema.TaggedError<InviteNotFound>()(
25
+ 'InviteNotFound',
26
+ {},
27
+ HttpApiSchema.annotations({ status: 404 }),
28
+ ) {}
29
+
30
+ export class AlreadyMember extends Schema.TaggedError<AlreadyMember>()(
31
+ 'AlreadyMember',
32
+ {},
33
+ HttpApiSchema.annotations({ status: 409 }),
34
+ ) {}
35
+
36
+ export class Forbidden extends Schema.TaggedError<Forbidden>()(
37
+ 'Forbidden',
38
+ {},
39
+ HttpApiSchema.annotations({ status: 403 }),
40
+ ) {}
41
+
42
+ export class InviteApiGroup extends HttpApiGroup.make('invite')
43
+ .add(
44
+ HttpApiEndpoint.get('getInvite', '/invite/:code')
45
+ .addSuccess(InviteInfo)
46
+ .addError(InviteNotFound, { status: 404 })
47
+ .setPath(Schema.Struct({ code: Schema.String })),
48
+ )
49
+ .add(
50
+ HttpApiEndpoint.post('joinViaInvite', '/invite/:code/join')
51
+ .addSuccess(JoinResult)
52
+ .addError(InviteNotFound, { status: 404 })
53
+ .addError(AlreadyMember, { status: 409 })
54
+ .setPath(Schema.Struct({ code: Schema.String }))
55
+ .middleware(AuthMiddleware),
56
+ )
57
+ .add(
58
+ HttpApiEndpoint.post('regenerateInvite', '/teams/:teamId/invite/regenerate')
59
+ .addSuccess(InviteCode)
60
+ .addError(Forbidden, { status: 403 })
61
+ .setPath(Schema.Struct({ teamId: TeamId }))
62
+ .middleware(AuthMiddleware),
63
+ )
64
+ .add(
65
+ HttpApiEndpoint.del('disableInvite', '/teams/:teamId/invite')
66
+ .addSuccess(Schema.Void)
67
+ .addError(Forbidden, { status: 403 })
68
+ .setPath(Schema.Struct({ teamId: TeamId }))
69
+ .middleware(AuthMiddleware),
70
+ ) {}
package/src/index.ts CHANGED
@@ -1,2 +1,15 @@
1
+ export * as ApiGroup from './ApiGroup.js';
1
2
 
2
- export * as TodosApi from "./TodosApi.js"
3
+ export * as Auth from './api/Auth.js';
4
+
5
+ export * as Invite from './api/Invite.js';
6
+
7
+ export * as Session from './models/Session.js';
8
+
9
+ export * as Team from './models/Team.js';
10
+
11
+ export * as TeamInvite from './models/TeamInvite.js';
12
+
13
+ export * as TeamMember from './models/TeamMember.js';
14
+
15
+ export * as User from './models/User.js';
@@ -0,0 +1,16 @@
1
+ import { Model } from '@effect/sql';
2
+ import { DateTime, Schema } from 'effect';
3
+ import { UserId } from './User.js';
4
+
5
+ const DateTimeFromDate = Schema.transform(Schema.DateFromSelf, Schema.DateTimeUtcFromSelf, {
6
+ decode: (date) => DateTime.unsafeFromDate(date),
7
+ encode: (dt) => new Date(DateTime.toEpochMillis(dt)),
8
+ });
9
+
10
+ export class Session extends Model.Class<Session>('Session')({
11
+ id: Model.Generated(Schema.String),
12
+ user_id: UserId,
13
+ token: Schema.String,
14
+ expires_at: DateTimeFromDate,
15
+ created_at: Model.DateTimeInsertFromDate,
16
+ }) {}