@sideline/domain 0.0.0 → 0.1.1
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.
- package/ApiGroup/package.json +6 -0
- package/api/Auth/package.json +6 -0
- package/api/Invite/package.json +6 -0
- package/dist/cjs/ApiGroup.js +9 -0
- package/dist/cjs/ApiGroup.js.map +1 -0
- package/dist/cjs/api/Auth.js +85 -0
- package/dist/cjs/api/Auth.js.map +1 -0
- package/dist/cjs/api/Invite.js +61 -0
- package/dist/cjs/api/Invite.js.map +1 -0
- package/dist/cjs/index.js +17 -3
- package/dist/cjs/models/Session.js +22 -0
- package/dist/cjs/models/Session.js.map +1 -0
- package/dist/cjs/models/Team.js +19 -0
- package/dist/cjs/models/Team.js.map +1 -0
- package/dist/cjs/models/TeamInvite.js +26 -0
- package/dist/cjs/models/TeamInvite.js.map +1 -0
- package/dist/cjs/models/TeamMember.js +21 -0
- package/dist/cjs/models/TeamMember.js.map +1 -0
- package/dist/cjs/models/User.js +33 -0
- package/dist/cjs/models/User.js.map +1 -0
- package/dist/dts/ApiGroup.d.ts +3 -0
- package/dist/dts/ApiGroup.d.ts.map +1 -0
- package/dist/dts/api/Auth.d.ts +128 -0
- package/dist/dts/api/Auth.d.ts.map +1 -0
- package/dist/dts/api/Invite.d.ts +78 -0
- package/dist/dts/api/Invite.d.ts.map +1 -0
- package/dist/dts/index.d.ts +8 -1
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/models/Session.d.ts +82 -0
- package/dist/dts/models/Session.d.ts.map +1 -0
- package/dist/dts/models/Team.d.ts +82 -0
- package/dist/dts/models/Team.d.ts.map +1 -0
- package/dist/dts/models/TeamInvite.d.ts +110 -0
- package/dist/dts/models/TeamInvite.d.ts.map +1 -0
- package/dist/dts/models/TeamMember.d.ts +86 -0
- package/dist/dts/models/TeamMember.d.ts.map +1 -0
- package/dist/dts/models/User.d.ts +227 -0
- package/dist/dts/models/User.d.ts.map +1 -0
- package/dist/esm/ApiGroup.js +2 -0
- package/dist/esm/ApiGroup.js.map +1 -0
- package/dist/esm/api/Auth.js +67 -0
- package/dist/esm/api/Auth.js.map +1 -0
- package/dist/esm/api/Invite.js +48 -0
- package/dist/esm/api/Invite.js.map +1 -0
- package/dist/esm/index.js +8 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/models/Session.js +15 -0
- package/dist/esm/models/Session.js.map +1 -0
- package/dist/esm/models/Team.js +12 -0
- package/dist/esm/models/Team.js.map +1 -0
- package/dist/esm/models/TeamInvite.js +19 -0
- package/dist/esm/models/TeamInvite.js.map +1 -0
- package/dist/esm/models/TeamMember.js +14 -0
- package/dist/esm/models/TeamMember.js.map +1 -0
- package/dist/esm/models/User.js +26 -0
- package/dist/esm/models/User.js.map +1 -0
- package/models/Session/package.json +6 -0
- package/models/Team/package.json +6 -0
- package/models/TeamInvite/package.json +6 -0
- package/models/TeamMember/package.json +6 -0
- package/models/User/package.json +6 -0
- package/package.json +67 -10
- package/src/ApiGroup.ts +14 -0
- package/src/api/Auth.ts +104 -0
- package/src/api/Invite.ts +70 -0
- package/src/index.ts +14 -1
- package/src/models/Session.ts +16 -0
- package/src/models/Team.ts +14 -0
- package/src/models/TeamInvite.ts +24 -0
- package/src/models/TeamMember.ts +18 -0
- package/src/models/User.ts +36 -0
- package/TodosApi/package.json +0 -6
- package/dist/cjs/TodosApi.js +0 -39
- package/dist/cjs/TodosApi.js.map +0 -1
- package/dist/dts/TodosApi.d.ts +0 -45
- package/dist/dts/TodosApi.d.ts.map +0 -1
- package/dist/esm/TodosApi.js +0 -29
- package/dist/esm/TodosApi.js.map +0 -1
- 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
|
|
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
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["
|
|
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":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sideline/domain",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
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/
|
|
14
|
-
"@effect/
|
|
15
|
-
"effect": "
|
|
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
|
-
"./
|
|
28
|
-
"types": "./dist/dts/
|
|
29
|
-
"import": "./dist/esm/
|
|
30
|
-
"default": "./dist/cjs/
|
|
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
|
-
"
|
|
36
|
-
"./dist/dts/
|
|
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
|
}
|
package/src/ApiGroup.ts
ADDED
|
@@ -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];
|
package/src/api/Auth.ts
ADDED
|
@@ -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
|
|
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
|
+
}) {}
|