Skip to content

Commit 0e4309f

Browse files
committed
WIP
1 parent 7448570 commit 0e4309f

File tree

87 files changed

+2312
-4257
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+2312
-4257
lines changed

.adonisjs/api.ts

Lines changed: 335 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,335 @@
1+
// @ts-nocheck
2+
/* eslint-disable */
3+
// --------------------------------------------------
4+
// This file is auto-generated by Tuyau. Do not edit manually !
5+
// --------------------------------------------------
6+
7+
import type { MakeTuyauRequest, MakeTuyauResponse } from '@tuyau/utils/types'
8+
import type { InferInput } from '@vinejs/vine/types'
9+
10+
type UsersGetHead = {
11+
request: unknown
12+
response: MakeTuyauResponse<import('../app/controllers/users_controller.ts').default['index'], false>
13+
}
14+
type UsersCreateGetHead = {
15+
request: unknown
16+
response: MakeTuyauResponse<import('../app/controllers/users_controller.ts').default['create'], false>
17+
}
18+
type UsersPost = {
19+
request: MakeTuyauRequest<InferInput<typeof import('../app/validators/users_validator.ts')['createUserValidator']>>
20+
response: MakeTuyauResponse<import('../app/controllers/users_controller.ts').default['store'], true>
21+
}
22+
type UsersIdGetHead = {
23+
request: unknown
24+
response: MakeTuyauResponse<import('../app/controllers/users_controller.ts').default['show'], false>
25+
}
26+
type UsersIdEditGetHead = {
27+
request: unknown
28+
response: MakeTuyauResponse<import('../app/controllers/users_controller.ts').default['edit'], false>
29+
}
30+
type UsersIdPutPatch = {
31+
request: MakeTuyauRequest<InferInput<typeof import('../app/validators/users_validator.ts')['updateUserValidator']>>
32+
response: MakeTuyauResponse<import('../app/controllers/users_controller.ts').default['update'], true>
33+
}
34+
type UsersIdDelete = {
35+
request: unknown
36+
response: MakeTuyauResponse<import('../app/controllers/users_controller.ts').default['destroy'], false>
37+
}
38+
type ProfileGetHead = {
39+
request: unknown
40+
response: MakeTuyauResponse<import('../app/controllers/profile_controller.ts').default['show'], false>
41+
}
42+
type ProfileWebauthnOptionsGetHead = {
43+
request: unknown
44+
response: MakeTuyauResponse<import('../app/controllers/profile/webauthn_controller.ts').default['options'], false>
45+
}
46+
type ProfileWebauthnPost = {
47+
request: unknown
48+
response: MakeTuyauResponse<import('../app/controllers/profile/webauthn_controller.ts').default['store'], false>
49+
}
50+
type ProfileWebauthnIdDelete = {
51+
request: unknown
52+
response: MakeTuyauResponse<import('../app/controllers/profile/webauthn_controller.ts').default['destroy'], false>
53+
}
54+
type ProfileTotpPost = {
55+
request: unknown
56+
response: MakeTuyauResponse<import('../app/controllers/profile/totp_controller.ts').default['store'], false>
57+
}
58+
type ProfileTotpVerifyPost = {
59+
request: MakeTuyauRequest<InferInput<typeof import('../app/validators/totp_validator.ts')['verifyValidator']>>
60+
response: MakeTuyauResponse<import('../app/controllers/profile/totp_controller.ts').default['verify'], true>
61+
}
62+
type ProfileTotpDelete = {
63+
request: unknown
64+
response: MakeTuyauResponse<import('../app/controllers/profile/totp_controller.ts').default['destroy'], false>
65+
}
66+
type ProfileTotpRegenerationPost = {
67+
request: unknown
68+
response: MakeTuyauResponse<import('../app/controllers/profile/totp_controller.ts').default['regenerateRecoveryCodes'], false>
69+
}
70+
type ProfileConfirmsecurityGetHead = {
71+
request: unknown
72+
response: MakeTuyauResponse<import('../app/controllers/profile/confirm_security_controller.ts').default['index'], false>
73+
}
74+
type ProfileConfirmsecurityPost = {
75+
request: MakeTuyauRequest<InferInput<typeof import('../app/validators/confirm_security_validator.ts')['confirmSecurityValidator']>>
76+
response: MakeTuyauResponse<import('../app/controllers/profile/confirm_security_controller.ts').default['store'], true>
77+
}
78+
type SessionDelete = {
79+
request: unknown
80+
response: MakeTuyauResponse<import('../app/controllers/session_controller.ts').default['destroy'], false>
81+
}
82+
type SignInGetHead = {
83+
request: unknown
84+
response: MakeTuyauResponse<import('../app/controllers/session_controller.ts').default['show'], false>
85+
}
86+
type SessionPost = {
87+
request: MakeTuyauRequest<InferInput<typeof import('../app/validators/session_validator.ts')['createSessionValidator']>>
88+
response: MakeTuyauResponse<import('../app/controllers/session_controller.ts').default['store'], true>
89+
}
90+
type SessionOptionsIdGetHead = {
91+
request: unknown
92+
response: MakeTuyauResponse<import('../app/controllers/session/options_controller.ts').default['handle'], false>
93+
}
94+
type SessionWebauthnIdGetHead = {
95+
request: unknown
96+
response: MakeTuyauResponse<import('../app/controllers/session/webauthn_controller.ts').default['index'], false>
97+
}
98+
type SessionWebauthnIdPost = {
99+
request: unknown
100+
response: MakeTuyauResponse<import('../app/controllers/session/webauthn_controller.ts').default['store'], false>
101+
}
102+
type SessionTotpGetHead = {
103+
request: unknown
104+
response: MakeTuyauResponse<import('../app/controllers/session/totp_controller.ts').default['index'], false>
105+
}
106+
type SessionTotpPost = {
107+
request: MakeTuyauRequest<InferInput<typeof import('../app/validators/verify_otp.ts')['verifyOtpValidator']>>
108+
response: MakeTuyauResponse<import('../app/controllers/session/totp_controller.ts').default['store'], true>
109+
}
110+
type SessionTotpRecoverGetHead = {
111+
request: unknown
112+
response: MakeTuyauResponse<import('../app/controllers/session/totp_recover_controller.ts').default['index'], false>
113+
}
114+
type SessionTotpRecoverPost = {
115+
request: MakeTuyauRequest<InferInput<typeof import('../app/validators/recover_otp_validator.ts')['recoverOtpValidator']>>
116+
response: MakeTuyauResponse<import('../app/controllers/session/totp_recover_controller.ts').default['store'], true>
117+
}
118+
type ColorsCssGetHead = {
119+
request: unknown
120+
response: MakeTuyauResponse<import('../app/controllers/colors_controller.ts').default['handle'], false>
121+
}
122+
export interface ApiDefinition {
123+
'users': {
124+
'$url': {
125+
};
126+
'$get': UsersGetHead;
127+
'$head': UsersGetHead;
128+
'create': {
129+
'$url': {
130+
};
131+
'$get': UsersCreateGetHead;
132+
'$head': UsersCreateGetHead;
133+
};
134+
'$post': UsersPost;
135+
':id': {
136+
'$url': {
137+
};
138+
'$get': UsersIdGetHead;
139+
'$head': UsersIdGetHead;
140+
'edit': {
141+
'$url': {
142+
};
143+
'$get': UsersIdEditGetHead;
144+
'$head': UsersIdEditGetHead;
145+
};
146+
'$put': UsersIdPutPatch;
147+
'$patch': UsersIdPutPatch;
148+
'$delete': UsersIdDelete;
149+
};
150+
};
151+
'profile': {
152+
'$url': {
153+
};
154+
'$get': ProfileGetHead;
155+
'$head': ProfileGetHead;
156+
'webauthn': {
157+
'options': {
158+
'$url': {
159+
};
160+
'$get': ProfileWebauthnOptionsGetHead;
161+
'$head': ProfileWebauthnOptionsGetHead;
162+
};
163+
'$url': {
164+
};
165+
'$post': ProfileWebauthnPost;
166+
':id': {
167+
'$url': {
168+
};
169+
'$delete': ProfileWebauthnIdDelete;
170+
};
171+
};
172+
'totp': {
173+
'$url': {
174+
};
175+
'$post': ProfileTotpPost;
176+
'verify': {
177+
'$url': {
178+
};
179+
'$post': ProfileTotpVerifyPost;
180+
};
181+
'$delete': ProfileTotpDelete;
182+
'regeneration': {
183+
'$url': {
184+
};
185+
'$post': ProfileTotpRegenerationPost;
186+
};
187+
};
188+
'confirm-security': {
189+
'$url': {
190+
};
191+
'$get': ProfileConfirmsecurityGetHead;
192+
'$head': ProfileConfirmsecurityGetHead;
193+
'$post': ProfileConfirmsecurityPost;
194+
};
195+
};
196+
'session': {
197+
'$url': {
198+
};
199+
'$delete': SessionDelete;
200+
'$post': SessionPost;
201+
'options': {
202+
':email': {
203+
'$url': {
204+
};
205+
'$get': SessionOptionsIdGetHead;
206+
'$head': SessionOptionsIdGetHead;
207+
};
208+
};
209+
'webauthn': {
210+
':email': {
211+
'$url': {
212+
};
213+
'$get': SessionWebauthnIdGetHead;
214+
'$head': SessionWebauthnIdGetHead;
215+
'$post': SessionWebauthnIdPost;
216+
};
217+
};
218+
'totp': {
219+
'$url': {
220+
};
221+
'$get': SessionTotpGetHead;
222+
'$head': SessionTotpGetHead;
223+
'$post': SessionTotpPost;
224+
'recover': {
225+
'$url': {
226+
};
227+
'$get': SessionTotpRecoverGetHead;
228+
'$head': SessionTotpRecoverGetHead;
229+
'$post': SessionTotpRecoverPost;
230+
};
231+
};
232+
};
233+
'sign-in': {
234+
'$url': {
235+
};
236+
'$get': SignInGetHead;
237+
'$head': SignInGetHead;
238+
};
239+
'colors.css': {
240+
'$url': {
241+
};
242+
'$get': ColorsCssGetHead;
243+
'$head': ColorsCssGetHead;
244+
};
245+
}
246+
const routes = [
247+
{
248+
params: [],
249+
name: 'users.index',
250+
path: '/users',
251+
method: ["GET","HEAD"],
252+
types: {} as UsersGetHead,
253+
},
254+
{
255+
params: [],
256+
name: 'users.create',
257+
path: '/users/create',
258+
method: ["GET","HEAD"],
259+
types: {} as UsersCreateGetHead,
260+
},
261+
{
262+
params: [],
263+
name: 'users.store',
264+
path: '/users',
265+
method: ["POST"],
266+
types: {} as UsersPost,
267+
},
268+
{
269+
params: ["id"],
270+
name: 'users.show',
271+
path: '/users/:id',
272+
method: ["GET","HEAD"],
273+
types: {} as UsersIdGetHead,
274+
},
275+
{
276+
params: ["id"],
277+
name: 'users.edit',
278+
path: '/users/:id/edit',
279+
method: ["GET","HEAD"],
280+
types: {} as UsersIdEditGetHead,
281+
},
282+
{
283+
params: ["id"],
284+
name: 'users.update',
285+
path: '/users/:id',
286+
method: ["PUT","PATCH"],
287+
types: {} as UsersIdPutPatch,
288+
},
289+
{
290+
params: ["id"],
291+
name: 'users.destroy',
292+
path: '/users/:id',
293+
method: ["DELETE"],
294+
types: {} as UsersIdDelete,
295+
},
296+
{
297+
params: [],
298+
name: 'profile_webauthn.index',
299+
path: '/profile/webauthn',
300+
method: ["GET","HEAD"],
301+
types: {} as unknown,
302+
},
303+
{
304+
params: [],
305+
name: 'profile_webauthn.store',
306+
path: '/profile/webauthn',
307+
method: ["POST"],
308+
types: {} as ProfileWebauthnPost,
309+
},
310+
{
311+
params: ["id"],
312+
name: 'profile_webauthn.show',
313+
path: '/profile/webauthn/:id',
314+
method: ["GET","HEAD"],
315+
types: {} as unknown,
316+
},
317+
{
318+
params: ["id"],
319+
name: 'profile_webauthn.update',
320+
path: '/profile/webauthn/:id',
321+
method: ["PUT","PATCH"],
322+
types: {} as unknown,
323+
},
324+
{
325+
params: ["id"],
326+
name: 'profile_webauthn.destroy',
327+
path: '/profile/webauthn/:id',
328+
method: ["DELETE"],
329+
types: {} as ProfileWebauthnIdDelete,
330+
},
331+
] as const;
332+
export const api = {
333+
routes,
334+
definition: {} as ApiDefinition
335+
}

.adonisjs/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/// <reference path="../adonisrc.ts" />
2+
3+
export * from './api.js'

README.example.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ Otherwise the following changes where made:
158158
- Setup script added: `bin/setup`
159159
- Scripts for creating and dropping databases
160160
- `config/database.ts`: A single place for db config for multiple envs
161+
- The concept of a "base" error on form handlers
162+
- Triggered by throwing a `FormError` in a controller
163+
- Shown with the `BaseFormError` component
161164
- Database
162165
- Kysely used instead of lucid
163166
- Allows us to have types in react
@@ -168,7 +171,7 @@ Otherwise the following changes where made:
168171
- Automatically run pending migrations
169172
- Code coverage has been set up (Use `--coverage-text` flag when running tests)
170173
- Authentication implemented
171-
- Two-factor auth: TOTP + recovery codes via `@nulix/adonis-2fa`, WebAuthn (security keys/passkeys) under `/2fa/*` routes
174+
- TOTP + Webauthn auth
172175
- Landing page and simple user management implemented
173176

174177
### Third party services

adonisrc.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export default defineConfig({
1414
() => import('@adonisjs/core/commands'),
1515
() => import('@adonisjs/bouncer/commands'),
1616
() => import('@adonisjs/mail/commands'),
17+
() => import('@tuyau/core/commands'),
1718
],
1819

1920
/*
@@ -45,6 +46,7 @@ export default defineConfig({
4546
() => import('@adonisjs/i18n/i18n_provider'),
4647
() => import('@adonisjs/mail/mail_provider'),
4748
() => import('@nulix/adonis-2fa/two_factor_auth_provider'),
49+
() => import('@tuyau/core/tuyau_provider'),
4850
],
4951

5052
/*

0 commit comments

Comments
 (0)