Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
6c3ae23
Merge pull request #2 from EdgarEldy/feature/data-modeling
EdgarEldy Aug 24, 2026
16361f2
chore(auth): add bouncer, limiter and jose dependencies
EdgarEldy Aug 24, 2026
5ddb82a
chore(auth): register the bouncer and limiter providers
EdgarEldy Aug 24, 2026
4467bc3
chore(auth): register the bouncer initialization middleware
EdgarEldy Aug 24, 2026
a3fe08f
feat(auth): add the bouncer initialization middleware
EdgarEldy Aug 24, 2026
59b9996
chore(auth): add the bouncer abilities entry point
EdgarEldy Aug 24, 2026
0a0be48
chore(auth): configure the rate limiter database store
EdgarEldy Aug 24, 2026
73948d2
feat(auth): define the auth rate limiter
EdgarEldy Aug 24, 2026
842220f
feat(auth): add the rate limits migration
EdgarEldy Aug 24, 2026
ca6240e
fix(auth): wire the auth throttle to THROTTLE_AUTH_MAX and THROTTLE_A…
EdgarEldy Aug 24, 2026
26d8c03
chore(auth): add the argon2 hashing dependency
EdgarEldy Aug 24, 2026
3f5419d
feat(auth): configure argon2 as the default hasher
EdgarEldy Aug 24, 2026
2411b15
fix(auth): hardcode the limiter default store to database
EdgarEldy Aug 24, 2026
dc3ee04
fix(auth): remove the Edge view branch from the bouncer middleware
EdgarEldy Aug 24, 2026
3e13896
chore(codegen): regenerate the policies registry
EdgarEldy Aug 24, 2026
861fe0c
chore(database): regenerate the schema snapshot with rate_limits
EdgarEldy Aug 24, 2026
084dd79
chore(auth): register the app/auth import alias
EdgarEldy Aug 24, 2026
cd97d7f
feat(auth): add a custom JWT guard
EdgarEldy Aug 24, 2026
31a5f31
feat(auth): switch the default guard to jwt
EdgarEldy Aug 24, 2026
36894f8
feat(auth): add VineJS schemas for the auth endpoints
EdgarEldy Aug 24, 2026
169166f
feat(auth): reject blacklisted JWTs in AuthMiddleware
EdgarEldy Aug 24, 2026
d41f347
feat(auth): enforce role checks in RoleMiddleware
EdgarEldy Aug 24, 2026
ce30d01
feat(auth): add AuthService covering the full account lifecycle
EdgarEldy Aug 24, 2026
bb9e495
feat(auth): add AuthController as a thin layer over AuthService
EdgarEldy Aug 24, 2026
25a9418
feat(auth): declare auth routes and a temporary middleware smoke-test…
EdgarEldy Aug 24, 2026
72b6244
chore(codegen): regenerate the client and server registries
EdgarEldy Aug 24, 2026
696ab37
test(auth): add shared login and fixture helpers for functional auth …
EdgarEldy Aug 24, 2026
2e75a77
test(auth): add unit tests for AuthService register, activate, login …
EdgarEldy Aug 24, 2026
d94cd26
test(auth): add unit test for AuthMiddleware blacklisted jti rejection
EdgarEldy Aug 24, 2026
abf6965
test(auth): add functional tests for the auth lifecycle, middleware a…
EdgarEldy Aug 24, 2026
b9fb369
docs(auth): specify user, role and permission administration
EdgarEldy Aug 24, 2026
6f3257f
fix(auth): address code review findings on the JWT guard and auth flow
EdgarEldy Aug 24, 2026
35dce49
chore(mail): add the @adonisjs/mail dependency
EdgarEldy Aug 24, 2026
b09bdf8
chore(mail): register the mail commands and provider
EdgarEldy Aug 24, 2026
2ae0dc8
chore(mail): validate mail env variables at boot
EdgarEldy Aug 24, 2026
3b77fdd
feat(mail): configure the SMTP mailer against Mailhog
EdgarEldy Aug 24, 2026
b0e5563
chore(mail): add Mailhog to the development docker-compose stack
EdgarEldy Aug 24, 2026
4478638
chore(mail): add Mailhog to the test docker-compose stack
EdgarEldy Aug 24, 2026
a6a4b14
docs(mail): document the mail env variables
EdgarEldy Aug 24, 2026
dba4b38
chore(mail): add mail variables to the development env file
EdgarEldy Aug 24, 2026
372eea2
chore(mail): add mail variables to the test env file
EdgarEldy Aug 24, 2026
45908af
ci: add a Mailhog service for the email flows this branch adds
EdgarEldy Aug 24, 2026
28ea624
ci: add a Mailhog service for the email flows this branch adds
EdgarEldy Aug 24, 2026
8b23ecc
feat(mail): add ActivationMail for the register flow
EdgarEldy Aug 24, 2026
6ee61b2
feat(mail): add PasswordResetMail for the forgot-password flow
EdgarEldy Aug 24, 2026
d92af08
feat(auth): send real activation and reset emails instead of returnin…
EdgarEldy Aug 24, 2026
2c26477
feat(auth): stop echoing activation and reset tokens in HTTP responses
EdgarEldy Aug 24, 2026
af56fde
feat(auth): add user_validator with updateUserSchema and assignRoleSc…
EdgarEldy Aug 24, 2026
5cde323
feat(auth): add role_validator with createRoleSchema, updateRoleSchem…
EdgarEldy Aug 24, 2026
4c3b222
feat(auth): add permission_validator with createPermissionSchema and …
EdgarEldy Aug 24, 2026
6576448
feat(auth): add UsersService for the ADMIN user administration endpoints
EdgarEldy Aug 24, 2026
697b03b
feat(auth): add RolesService for the ADMIN role administration endpoints
EdgarEldy Aug 24, 2026
d31a5eb
feat(auth): add PermissionsService for the ADMIN permission administr…
EdgarEldy Aug 24, 2026
dbcf6df
feat(auth): add UsersController for the ADMIN user administration end…
EdgarEldy Aug 24, 2026
7eb2eb4
feat(auth): add RolesController for the ADMIN role administration end…
EdgarEldy Aug 24, 2026
7e32cff
feat(auth): add PermissionsController for the ADMIN permission admini…
EdgarEldy Aug 24, 2026
99a9bad
feat(auth): declare the user, role and permission administration routes
EdgarEldy Aug 24, 2026
88cc56a
chore(codegen): regenerate the Tuyau API client registry and route ma…
EdgarEldy Aug 24, 2026
14f6602
test(auth): read the activation token from the database instead of th…
EdgarEldy Aug 24, 2026
105503f
test(auth): look up the activation token in the database for the full…
EdgarEldy Aug 24, 2026
b65c36b
test(auth): verify UsersService.assignRole is idempotent
EdgarEldy Aug 26, 2026
88436c6
test(auth): verify RolesService.remove blocks deletion while a user h…
EdgarEldy Aug 26, 2026
619178a
test(auth): verify PermissionsService.remove blocks deletion while a …
EdgarEldy Aug 26, 2026
d6873ac
test(auth): cover the user administration HTTP surface end to end
EdgarEldy Aug 26, 2026
ea4f228
test(auth): cover the role administration HTTP surface end to end
EdgarEldy Aug 26, 2026
ae779d0
test(auth): cover the permission administration HTTP surface end to end
EdgarEldy Aug 26, 2026
d853138
test(auth): verify every admin route is gated by auth and role middle…
EdgarEldy Aug 26, 2026
87afc2b
fix(auth): ensure the USER role exists before registering in roles.sp…
EdgarEldy Aug 26, 2026
f64eda2
fix(auth): cast response.body() where the roles/permissions routes co…
EdgarEldy Aug 26, 2026
6104d91
style(auth): apply Prettier formatting to the RBAC and auth service t…
EdgarEldy Aug 26, 2026
c9a930b
fix(auth): restore Secret redaction on APP_KEY and mark JWT_SECRET th…
EdgarEldy Aug 26, 2026
8f4ce90
fix(auth): release the JWT_SECRET Secret before encoding it
EdgarEldy Aug 26, 2026
f66f44c
refactor(auth): move toPageResponse into page_response.ts
EdgarEldy Aug 26, 2026
c6f74ca
fix(auth): dedupe pagination, normalize email casing, avoid a redunda…
EdgarEldy Aug 26, 2026
a88de89
fix(auth): dedupe pagination, guard duplicate role names, avoid a red…
EdgarEldy Aug 26, 2026
3d4123d
refactor(auth): dedupe toPageResponse in permissions_service.ts
EdgarEldy Aug 26, 2026
ac50ba4
fix(auth): add a shared pagination validator
EdgarEldy Aug 26, 2026
7b8f32e
fix(auth): validate pagination params in UsersController.index
EdgarEldy Aug 26, 2026
6e8007c
fix(auth): validate pagination params in RolesController.index
EdgarEldy Aug 26, 2026
4587bc0
fix(auth): validate pagination params in PermissionsController.index
EdgarEldy Aug 26, 2026
2dd330a
refactor(auth): add a fail() helper for the error response envelope
EdgarEldy Aug 26, 2026
6457f50
fix(auth): use fail() and simplify a redundant status check
EdgarEldy Aug 26, 2026
5a532f9
fix(auth): use fail() and reject requests for a disabled or locked ac…
EdgarEldy Aug 26, 2026
c349f57
refactor(auth): use fail() for the error response envelope
EdgarEldy Aug 26, 2026
6a63ba3
fix(auth): pre-check duplicate email, normalize casing, don't fail on…
EdgarEldy Aug 26, 2026
8b9ddd7
fix(auth): cap password length against an Argon2 cost-amplification v…
EdgarEldy Aug 26, 2026
92dd417
fix(mail): add an HTML-escaping helper for untrusted mail content
EdgarEldy Aug 26, 2026
8ef286f
fix(mail): escape firstName in ActivationMail's HTML body
EdgarEldy Aug 26, 2026
1f97186
fix(mail): escape firstName in PasswordResetMail's HTML body
EdgarEldy Aug 26, 2026
50b73dd
fix(auth): update the AuthMiddleware unit test for the enabled/locked…
EdgarEldy Aug 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .adonisjs/client/manifest.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@
/// <reference path="../../adonisrc.ts" />
/// <reference path="../../config/auth.ts" />
/// <reference path="../../config/hash.ts" />
/// <reference path="../../config/limiter.ts" />
/// <reference path="../../config/logger.ts" />
/// <reference path="../../config/mail.ts" />
160 changes: 146 additions & 14 deletions .adonisjs/client/registry/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,161 @@ import type { ApiDefinition } from './tree.d.ts'
const placeholder: any = {}

const routes = {
'auth.new_account.store': {
'health.index': {
methods: ["GET","HEAD"],
pattern: '/api/v1/health',
tokens: [{"old":"/api/v1/health","type":0,"val":"api","end":""},{"old":"/api/v1/health","type":0,"val":"v1","end":""},{"old":"/api/v1/health","type":0,"val":"health","end":""}],
types: placeholder as Registry['health.index']['types'],
},
'auth.register': {
methods: ["POST"],
pattern: '/api/v1/auth/signup',
tokens: [{"old":"/api/v1/auth/signup","type":0,"val":"api","end":""},{"old":"/api/v1/auth/signup","type":0,"val":"v1","end":""},{"old":"/api/v1/auth/signup","type":0,"val":"auth","end":""},{"old":"/api/v1/auth/signup","type":0,"val":"signup","end":""}],
types: placeholder as Registry['auth.new_account.store']['types'],
pattern: '/api/v1/auth/register',
tokens: [{"old":"/api/v1/auth/register","type":0,"val":"api","end":""},{"old":"/api/v1/auth/register","type":0,"val":"v1","end":""},{"old":"/api/v1/auth/register","type":0,"val":"auth","end":""},{"old":"/api/v1/auth/register","type":0,"val":"register","end":""}],
types: placeholder as Registry['auth.register']['types'],
},
'auth.access_tokens.store': {
'auth.activate': {
methods: ["POST"],
pattern: '/api/v1/auth/activate',
tokens: [{"old":"/api/v1/auth/activate","type":0,"val":"api","end":""},{"old":"/api/v1/auth/activate","type":0,"val":"v1","end":""},{"old":"/api/v1/auth/activate","type":0,"val":"auth","end":""},{"old":"/api/v1/auth/activate","type":0,"val":"activate","end":""}],
types: placeholder as Registry['auth.activate']['types'],
},
'auth.login': {
methods: ["POST"],
pattern: '/api/v1/auth/login',
tokens: [{"old":"/api/v1/auth/login","type":0,"val":"api","end":""},{"old":"/api/v1/auth/login","type":0,"val":"v1","end":""},{"old":"/api/v1/auth/login","type":0,"val":"auth","end":""},{"old":"/api/v1/auth/login","type":0,"val":"login","end":""}],
types: placeholder as Registry['auth.access_tokens.store']['types'],
types: placeholder as Registry['auth.login']['types'],
},
'auth.logout': {
methods: ["POST"],
pattern: '/api/v1/auth/logout',
tokens: [{"old":"/api/v1/auth/logout","type":0,"val":"api","end":""},{"old":"/api/v1/auth/logout","type":0,"val":"v1","end":""},{"old":"/api/v1/auth/logout","type":0,"val":"auth","end":""},{"old":"/api/v1/auth/logout","type":0,"val":"logout","end":""}],
types: placeholder as Registry['auth.logout']['types'],
},
'auth.refresh': {
methods: ["POST"],
pattern: '/api/v1/auth/refresh',
tokens: [{"old":"/api/v1/auth/refresh","type":0,"val":"api","end":""},{"old":"/api/v1/auth/refresh","type":0,"val":"v1","end":""},{"old":"/api/v1/auth/refresh","type":0,"val":"auth","end":""},{"old":"/api/v1/auth/refresh","type":0,"val":"refresh","end":""}],
types: placeholder as Registry['auth.refresh']['types'],
},
'auth.forgot_password': {
methods: ["POST"],
pattern: '/api/v1/auth/forgot-password',
tokens: [{"old":"/api/v1/auth/forgot-password","type":0,"val":"api","end":""},{"old":"/api/v1/auth/forgot-password","type":0,"val":"v1","end":""},{"old":"/api/v1/auth/forgot-password","type":0,"val":"auth","end":""},{"old":"/api/v1/auth/forgot-password","type":0,"val":"forgot-password","end":""}],
types: placeholder as Registry['auth.forgot_password']['types'],
},
'auth.reset_password': {
methods: ["POST"],
pattern: '/api/v1/auth/reset-password',
tokens: [{"old":"/api/v1/auth/reset-password","type":0,"val":"api","end":""},{"old":"/api/v1/auth/reset-password","type":0,"val":"v1","end":""},{"old":"/api/v1/auth/reset-password","type":0,"val":"auth","end":""},{"old":"/api/v1/auth/reset-password","type":0,"val":"reset-password","end":""}],
types: placeholder as Registry['auth.reset_password']['types'],
},
'auth.me': {
methods: ["GET","HEAD"],
pattern: '/api/v1/auth/me',
tokens: [{"old":"/api/v1/auth/me","type":0,"val":"api","end":""},{"old":"/api/v1/auth/me","type":0,"val":"v1","end":""},{"old":"/api/v1/auth/me","type":0,"val":"auth","end":""},{"old":"/api/v1/auth/me","type":0,"val":"me","end":""}],
types: placeholder as Registry['auth.me']['types'],
},
'users.index': {
methods: ["GET","HEAD"],
pattern: '/api/v1/users',
tokens: [{"old":"/api/v1/users","type":0,"val":"api","end":""},{"old":"/api/v1/users","type":0,"val":"v1","end":""},{"old":"/api/v1/users","type":0,"val":"users","end":""}],
types: placeholder as Registry['users.index']['types'],
},
'users.show': {
methods: ["GET","HEAD"],
pattern: '/api/v1/users/:id',
tokens: [{"old":"/api/v1/users/:id","type":0,"val":"api","end":""},{"old":"/api/v1/users/:id","type":0,"val":"v1","end":""},{"old":"/api/v1/users/:id","type":0,"val":"users","end":""},{"old":"/api/v1/users/:id","type":1,"val":"id","end":""}],
types: placeholder as Registry['users.show']['types'],
},
'profile.profile.show': {
'users.update': {
methods: ["PUT"],
pattern: '/api/v1/users/:id',
tokens: [{"old":"/api/v1/users/:id","type":0,"val":"api","end":""},{"old":"/api/v1/users/:id","type":0,"val":"v1","end":""},{"old":"/api/v1/users/:id","type":0,"val":"users","end":""},{"old":"/api/v1/users/:id","type":1,"val":"id","end":""}],
types: placeholder as Registry['users.update']['types'],
},
'users.destroy': {
methods: ["DELETE"],
pattern: '/api/v1/users/:id',
tokens: [{"old":"/api/v1/users/:id","type":0,"val":"api","end":""},{"old":"/api/v1/users/:id","type":0,"val":"v1","end":""},{"old":"/api/v1/users/:id","type":0,"val":"users","end":""},{"old":"/api/v1/users/:id","type":1,"val":"id","end":""}],
types: placeholder as Registry['users.destroy']['types'],
},
'users.assign_role': {
methods: ["POST"],
pattern: '/api/v1/users/:id/roles',
tokens: [{"old":"/api/v1/users/:id/roles","type":0,"val":"api","end":""},{"old":"/api/v1/users/:id/roles","type":0,"val":"v1","end":""},{"old":"/api/v1/users/:id/roles","type":0,"val":"users","end":""},{"old":"/api/v1/users/:id/roles","type":1,"val":"id","end":""},{"old":"/api/v1/users/:id/roles","type":0,"val":"roles","end":""}],
types: placeholder as Registry['users.assign_role']['types'],
},
'users.revoke_role': {
methods: ["DELETE"],
pattern: '/api/v1/users/:id/roles/:roleId',
tokens: [{"old":"/api/v1/users/:id/roles/:roleId","type":0,"val":"api","end":""},{"old":"/api/v1/users/:id/roles/:roleId","type":0,"val":"v1","end":""},{"old":"/api/v1/users/:id/roles/:roleId","type":0,"val":"users","end":""},{"old":"/api/v1/users/:id/roles/:roleId","type":1,"val":"id","end":""},{"old":"/api/v1/users/:id/roles/:roleId","type":0,"val":"roles","end":""},{"old":"/api/v1/users/:id/roles/:roleId","type":1,"val":"roleId","end":""}],
types: placeholder as Registry['users.revoke_role']['types'],
},
'roles.index': {
methods: ["GET","HEAD"],
pattern: '/api/v1/roles',
tokens: [{"old":"/api/v1/roles","type":0,"val":"api","end":""},{"old":"/api/v1/roles","type":0,"val":"v1","end":""},{"old":"/api/v1/roles","type":0,"val":"roles","end":""}],
types: placeholder as Registry['roles.index']['types'],
},
'roles.show': {
methods: ["GET","HEAD"],
pattern: '/api/v1/roles/:id',
tokens: [{"old":"/api/v1/roles/:id","type":0,"val":"api","end":""},{"old":"/api/v1/roles/:id","type":0,"val":"v1","end":""},{"old":"/api/v1/roles/:id","type":0,"val":"roles","end":""},{"old":"/api/v1/roles/:id","type":1,"val":"id","end":""}],
types: placeholder as Registry['roles.show']['types'],
},
'roles.store': {
methods: ["POST"],
pattern: '/api/v1/roles',
tokens: [{"old":"/api/v1/roles","type":0,"val":"api","end":""},{"old":"/api/v1/roles","type":0,"val":"v1","end":""},{"old":"/api/v1/roles","type":0,"val":"roles","end":""}],
types: placeholder as Registry['roles.store']['types'],
},
'roles.update': {
methods: ["PUT"],
pattern: '/api/v1/roles/:id',
tokens: [{"old":"/api/v1/roles/:id","type":0,"val":"api","end":""},{"old":"/api/v1/roles/:id","type":0,"val":"v1","end":""},{"old":"/api/v1/roles/:id","type":0,"val":"roles","end":""},{"old":"/api/v1/roles/:id","type":1,"val":"id","end":""}],
types: placeholder as Registry['roles.update']['types'],
},
'roles.destroy': {
methods: ["DELETE"],
pattern: '/api/v1/roles/:id',
tokens: [{"old":"/api/v1/roles/:id","type":0,"val":"api","end":""},{"old":"/api/v1/roles/:id","type":0,"val":"v1","end":""},{"old":"/api/v1/roles/:id","type":0,"val":"roles","end":""},{"old":"/api/v1/roles/:id","type":1,"val":"id","end":""}],
types: placeholder as Registry['roles.destroy']['types'],
},
'roles.assign_permission': {
methods: ["POST"],
pattern: '/api/v1/roles/:id/permissions',
tokens: [{"old":"/api/v1/roles/:id/permissions","type":0,"val":"api","end":""},{"old":"/api/v1/roles/:id/permissions","type":0,"val":"v1","end":""},{"old":"/api/v1/roles/:id/permissions","type":0,"val":"roles","end":""},{"old":"/api/v1/roles/:id/permissions","type":1,"val":"id","end":""},{"old":"/api/v1/roles/:id/permissions","type":0,"val":"permissions","end":""}],
types: placeholder as Registry['roles.assign_permission']['types'],
},
'roles.revoke_permission': {
methods: ["DELETE"],
pattern: '/api/v1/roles/:id/permissions/:permissionId',
tokens: [{"old":"/api/v1/roles/:id/permissions/:permissionId","type":0,"val":"api","end":""},{"old":"/api/v1/roles/:id/permissions/:permissionId","type":0,"val":"v1","end":""},{"old":"/api/v1/roles/:id/permissions/:permissionId","type":0,"val":"roles","end":""},{"old":"/api/v1/roles/:id/permissions/:permissionId","type":1,"val":"id","end":""},{"old":"/api/v1/roles/:id/permissions/:permissionId","type":0,"val":"permissions","end":""},{"old":"/api/v1/roles/:id/permissions/:permissionId","type":1,"val":"permissionId","end":""}],
types: placeholder as Registry['roles.revoke_permission']['types'],
},
'permissions.index': {
methods: ["GET","HEAD"],
pattern: '/api/v1/account/profile',
tokens: [{"old":"/api/v1/account/profile","type":0,"val":"api","end":""},{"old":"/api/v1/account/profile","type":0,"val":"v1","end":""},{"old":"/api/v1/account/profile","type":0,"val":"account","end":""},{"old":"/api/v1/account/profile","type":0,"val":"profile","end":""}],
types: placeholder as Registry['profile.profile.show']['types'],
pattern: '/api/v1/permissions',
tokens: [{"old":"/api/v1/permissions","type":0,"val":"api","end":""},{"old":"/api/v1/permissions","type":0,"val":"v1","end":""},{"old":"/api/v1/permissions","type":0,"val":"permissions","end":""}],
types: placeholder as Registry['permissions.index']['types'],
},
'profile.access_tokens.destroy': {
'permissions.store': {
methods: ["POST"],
pattern: '/api/v1/account/logout',
tokens: [{"old":"/api/v1/account/logout","type":0,"val":"api","end":""},{"old":"/api/v1/account/logout","type":0,"val":"v1","end":""},{"old":"/api/v1/account/logout","type":0,"val":"account","end":""},{"old":"/api/v1/account/logout","type":0,"val":"logout","end":""}],
types: placeholder as Registry['profile.access_tokens.destroy']['types'],
pattern: '/api/v1/permissions',
tokens: [{"old":"/api/v1/permissions","type":0,"val":"api","end":""},{"old":"/api/v1/permissions","type":0,"val":"v1","end":""},{"old":"/api/v1/permissions","type":0,"val":"permissions","end":""}],
types: placeholder as Registry['permissions.store']['types'],
},
'permissions.update': {
methods: ["PUT"],
pattern: '/api/v1/permissions/:id',
tokens: [{"old":"/api/v1/permissions/:id","type":0,"val":"api","end":""},{"old":"/api/v1/permissions/:id","type":0,"val":"v1","end":""},{"old":"/api/v1/permissions/:id","type":0,"val":"permissions","end":""},{"old":"/api/v1/permissions/:id","type":1,"val":"id","end":""}],
types: placeholder as Registry['permissions.update']['types'],
},
'permissions.destroy': {
methods: ["DELETE"],
pattern: '/api/v1/permissions/:id',
tokens: [{"old":"/api/v1/permissions/:id","type":0,"val":"api","end":""},{"old":"/api/v1/permissions/:id","type":0,"val":"v1","end":""},{"old":"/api/v1/permissions/:id","type":0,"val":"permissions","end":""},{"old":"/api/v1/permissions/:id","type":1,"val":"id","end":""}],
types: placeholder as Registry['permissions.destroy']['types'],
},
} as const satisfies Record<string, AdonisEndpoint>

Expand Down
Loading
Loading