From 01efb11f70917f52c47aab277ad001a1e6ce6f1a Mon Sep 17 00:00:00 2001 From: Sonny Date: Sun, 10 Nov 2024 22:26:00 +0100 Subject: [PATCH] refactor: split backend by context instead of type 'controllers/models/...' --- .../controllers/admin_controller.ts | 12 +++--- .../middlewares/is_admin_middleware.ts} | 0 .../admin/routes/admin_routes.ts | 2 +- app/admin/routes/routes.ts | 1 + .../controllers/auth_controller.ts} | 4 +- .../middlewares}/auth_middleware.ts | 0 .../middlewares}/guest_middleware.ts | 0 .../middlewares}/silent_auth_middleware.ts | 0 .../auth.ts => app/auth/routes/auth_routes.ts | 8 ++-- app/auth/routes/routes.ts | 1 + .../controllers/collections_controller.ts | 12 +++--- app/{ => collections}/enums/visibility.ts | 0 app/{ => collections}/models/collection.ts | 8 ++-- .../collections/routes/collections_routes.ts | 2 +- app/collections/routes/routes.ts | 1 + .../create_collection_validator.ts} | 23 +--------- .../validators/delete_collection_validator.ts | 8 ++++ .../validators/update_collection_validator.ts | 14 ++++++ app/controllers/apps_controller.ts | 13 ------ app/{ => core}/constants/keys.ts | 0 app/{ => core}/constants/paths.ts | 0 app/{ => core}/exceptions/handler.ts | 0 app/{ => core}/lib/cache.ts | 0 .../container_bindings_middleware.ts | 0 .../middlewares}/log_request.ts | 0 app/{ => core}/models/app_base_model.ts | 0 app/core/validators/params_object.ts | 5 +++ .../controllers/favicons_controller.ts | 4 +- .../exceptions/favicon_not_found_exception.ts | 0 .../favicons/routes/favicons_routes.ts | 3 +- app/favicons/routes/routes.ts | 1 + app/home/routes/home_routes.ts | 3 ++ app/home/routes/routes.ts | 1 + app/legal/routes/legal_routes.ts | 4 ++ app/legal/routes/routes.ts | 1 + .../controllers/links_controller.ts | 16 +++---- app/{ => links}/models/link.ts | 6 +-- .../links/routes/links_routes.ts | 2 +- app/links/routes/routes.ts | 1 + app/links/validators/create_link_validator.ts | 11 +++++ app/links/validators/delete_link_validator.ts | 8 ++++ .../update_favorite_link_validator.ts | 10 +++++ app/links/validators/update_link_validator.ts | 14 ++++++ .../controllers/search_controller.ts} | 2 +- app/search/routes/routes.ts | 1 + .../search/routes/search_routes.ts | 3 +- .../shared_collections_controller.ts | 10 ++--- app/shared_collections/routes/routes.ts | 1 + .../routes/shared_collections_routes.ts | 2 +- .../validators/shared_collection.ts | 5 +-- .../session.ts => user/constants/theme.ts} | 0 app/user/controllers/theme_controller.ts | 12 ++++++ .../update_user_last_seen_middleware.ts | 0 app/{ => user}/models/user.ts | 6 +-- app/user/routes/routes.ts | 1 + app/user/routes/user_theme_route.ts | 5 +++ .../validators/update_theme_validator.ts} | 2 +- app/validators/link.ts | 43 ------------------- config/auth.ts | 4 +- config/inertia.ts | 4 +- .../1714253983443_create_collections_table.ts | 2 +- database/seeders/collection_seeder.ts | 6 +-- database/seeders/link_seeder.ts | 6 +-- database/seeders/user_seeder.ts | 2 +- .../components/dashboard/dashboard_header.tsx | 2 +- inertia/components/footer/footer.tsx | 2 +- inertia/components/form/form_collection.tsx | 3 +- inertia/components/navbar/navbar.tsx | 2 +- inertia/components/share/share_collection.tsx | 2 +- inertia/hooks/use_shortcut.tsx | 2 +- inertia/layouts/_base_layout.tsx | 5 ++- inertia/pages/collections/create.tsx | 2 +- inertia/tsconfig.json | 13 +----- inertia/types/{app.d.ts => app.ts} | 29 +++++++------ package.json | 31 ++++++------- start/kernel.ts | 16 +++---- start/routes.ts | 18 ++++---- start/routes/app.ts | 15 ------- 78 files changed, 230 insertions(+), 228 deletions(-) rename app/{ => admin}/controllers/admin_controller.ts (77%) rename app/{middleware/admin_middleware.ts => admin/middlewares/is_admin_middleware.ts} (100%) rename start/routes/admin.ts => app/admin/routes/admin_routes.ts (79%) create mode 100644 app/admin/routes/routes.ts rename app/{controllers/users_controller.ts => auth/controllers/auth_controller.ts} (96%) rename app/{middleware => auth/middlewares}/auth_middleware.ts (100%) rename app/{middleware => auth/middlewares}/guest_middleware.ts (100%) rename app/{middleware => auth/middlewares}/silent_auth_middleware.ts (100%) rename start/routes/auth.ts => app/auth/routes/auth_routes.ts (59%) create mode 100644 app/auth/routes/routes.ts rename app/{ => collections}/controllers/collections_controller.ts (91%) rename app/{ => collections}/enums/visibility.ts (100%) rename app/{ => collections}/models/collection.ts (74%) rename start/routes/collection.ts => app/collections/routes/collections_routes.ts (94%) create mode 100644 app/collections/routes/routes.ts rename app/{validators/collection.ts => collections/validators/create_collection_validator.ts} (51%) create mode 100644 app/collections/validators/delete_collection_validator.ts create mode 100644 app/collections/validators/update_collection_validator.ts delete mode 100644 app/controllers/apps_controller.ts rename app/{ => core}/constants/keys.ts (100%) rename app/{ => core}/constants/paths.ts (100%) rename app/{ => core}/exceptions/handler.ts (100%) rename app/{ => core}/lib/cache.ts (100%) rename app/{middleware => core/middlewares}/container_bindings_middleware.ts (100%) rename app/{middleware => core/middlewares}/log_request.ts (100%) rename app/{ => core}/models/app_base_model.ts (100%) create mode 100644 app/core/validators/params_object.ts rename app/{ => favicons}/controllers/favicons_controller.ts (97%) rename app/{ => favicons}/exceptions/favicon_not_found_exception.ts (100%) rename start/routes/favicon.ts => app/favicons/routes/favicons_routes.ts (66%) create mode 100644 app/favicons/routes/routes.ts create mode 100644 app/home/routes/home_routes.ts create mode 100644 app/home/routes/routes.ts create mode 100644 app/legal/routes/legal_routes.ts create mode 100644 app/legal/routes/routes.ts rename app/{ => links}/controllers/links_controller.ts (86%) rename app/{ => links}/models/link.ts (80%) rename start/routes/link.ts => app/links/routes/links_routes.ts (91%) create mode 100644 app/links/routes/routes.ts create mode 100644 app/links/validators/create_link_validator.ts create mode 100644 app/links/validators/delete_link_validator.ts create mode 100644 app/links/validators/update_favorite_link_validator.ts create mode 100644 app/links/validators/update_link_validator.ts rename app/{controllers/searches_controller.ts => search/controllers/search_controller.ts} (91%) create mode 100644 app/search/routes/routes.ts rename start/routes/search.ts => app/search/routes/search_routes.ts (75%) rename app/{ => shared_collections}/controllers/shared_collections_controller.ts (83%) create mode 100644 app/shared_collections/routes/routes.ts rename start/routes/shared_collection.ts => app/shared_collections/routes/shared_collections_routes.ts (70%) rename app/{ => shared_collections}/validators/shared_collection.ts (68%) rename app/{constants/session.ts => user/constants/theme.ts} (100%) create mode 100644 app/user/controllers/theme_controller.ts rename app/{middleware => user/middlewares}/update_user_last_seen_middleware.ts (100%) rename app/{ => user}/models/user.ts (87%) create mode 100644 app/user/routes/routes.ts create mode 100644 app/user/routes/user_theme_route.ts rename app/{validators/user.ts => user/validators/update_theme_validator.ts} (62%) delete mode 100644 app/validators/link.ts rename inertia/types/{app.d.ts => app.ts} (53%) delete mode 100644 start/routes/app.ts diff --git a/app/controllers/admin_controller.ts b/app/admin/controllers/admin_controller.ts similarity index 77% rename from app/controllers/admin_controller.ts rename to app/admin/controllers/admin_controller.ts index 0c4e3af..d099a0e 100644 --- a/app/controllers/admin_controller.ts +++ b/app/admin/controllers/admin_controller.ts @@ -1,9 +1,9 @@ -import CollectionsController from '#controllers/collections_controller'; -import LinksController from '#controllers/links_controller'; -import UsersController from '#controllers/users_controller'; -import User from '#models/user'; +import AuthController from '#auth/controllers/auth_controller'; +import CollectionsController from '#collections/controllers/collections_controller'; +import LinksController from '#links/controllers/links_controller'; +import User from '#user/models/user'; import { inject } from '@adonisjs/core'; -import type { HttpContext } from '@adonisjs/core/http'; +import { HttpContext } from '@adonisjs/core/http'; class UserWithRelationCountDto { constructor(private user: User) {} @@ -26,7 +26,7 @@ class UserWithRelationCountDto { @inject() export default class AdminController { constructor( - protected usersController: UsersController, + protected usersController: AuthController, protected linksController: LinksController, protected collectionsController: CollectionsController ) {} diff --git a/app/middleware/admin_middleware.ts b/app/admin/middlewares/is_admin_middleware.ts similarity index 100% rename from app/middleware/admin_middleware.ts rename to app/admin/middlewares/is_admin_middleware.ts diff --git a/start/routes/admin.ts b/app/admin/routes/admin_routes.ts similarity index 79% rename from start/routes/admin.ts rename to app/admin/routes/admin_routes.ts index c07a5ab..28dbeb5 100644 --- a/start/routes/admin.ts +++ b/app/admin/routes/admin_routes.ts @@ -1,7 +1,7 @@ import { middleware } from '#start/kernel'; import router from '@adonisjs/core/services/router'; -const AdminController = () => import('#controllers/admin_controller'); +const AdminController = () => import('#admin/controllers/admin_controller'); /** * Routes for admin dashboard diff --git a/app/admin/routes/routes.ts b/app/admin/routes/routes.ts new file mode 100644 index 0000000..8ca719c --- /dev/null +++ b/app/admin/routes/routes.ts @@ -0,0 +1 @@ +import './admin_routes.js'; diff --git a/app/controllers/users_controller.ts b/app/auth/controllers/auth_controller.ts similarity index 96% rename from app/controllers/users_controller.ts rename to app/auth/controllers/auth_controller.ts index 227a460..e6c57ab 100644 --- a/app/controllers/users_controller.ts +++ b/app/auth/controllers/auth_controller.ts @@ -1,10 +1,10 @@ -import User from '#models/user'; +import User from '#user/models/user'; import type { HttpContext } from '@adonisjs/core/http'; import logger from '@adonisjs/core/services/logger'; import db from '@adonisjs/lucid/services/db'; import { RouteName } from '@izzyjs/route/types'; -export default class UsersController { +export default class AuthController { private redirectTo: RouteName = 'auth'; login({ inertia }: HttpContext) { diff --git a/app/middleware/auth_middleware.ts b/app/auth/middlewares/auth_middleware.ts similarity index 100% rename from app/middleware/auth_middleware.ts rename to app/auth/middlewares/auth_middleware.ts diff --git a/app/middleware/guest_middleware.ts b/app/auth/middlewares/guest_middleware.ts similarity index 100% rename from app/middleware/guest_middleware.ts rename to app/auth/middlewares/guest_middleware.ts diff --git a/app/middleware/silent_auth_middleware.ts b/app/auth/middlewares/silent_auth_middleware.ts similarity index 100% rename from app/middleware/silent_auth_middleware.ts rename to app/auth/middlewares/silent_auth_middleware.ts diff --git a/start/routes/auth.ts b/app/auth/routes/auth_routes.ts similarity index 59% rename from start/routes/auth.ts rename to app/auth/routes/auth_routes.ts index a33f01f..b00d869 100644 --- a/start/routes/auth.ts +++ b/app/auth/routes/auth_routes.ts @@ -1,6 +1,6 @@ import { middleware } from '#start/kernel'; import router from '@adonisjs/core/services/router'; -const UsersController = () => import('#controllers/users_controller'); +const AuthController = () => import('#auth/controllers/auth_controller'); const ROUTES_PREFIX = '/auth'; @@ -9,9 +9,9 @@ const ROUTES_PREFIX = '/auth'; */ router .group(() => { - router.get('/google', [UsersController, 'google']).as('auth'); + router.get('/google', [AuthController, 'google']).as('auth'); router - .get('/callback', [UsersController, 'callbackAuth']) + .get('/callback', [AuthController, 'callbackAuth']) .as('auth.callback'); }) .prefix(ROUTES_PREFIX); @@ -21,7 +21,7 @@ router */ router .group(() => { - router.get('/logout', [UsersController, 'logout']).as('auth.logout'); + router.get('/logout', [AuthController, 'logout']).as('auth.logout'); }) .middleware([middleware.auth()]) .prefix(ROUTES_PREFIX); diff --git a/app/auth/routes/routes.ts b/app/auth/routes/routes.ts new file mode 100644 index 0000000..f7ed5f2 --- /dev/null +++ b/app/auth/routes/routes.ts @@ -0,0 +1 @@ +import './auth_routes.js'; diff --git a/app/controllers/collections_controller.ts b/app/collections/controllers/collections_controller.ts similarity index 91% rename from app/controllers/collections_controller.ts rename to app/collections/controllers/collections_controller.ts index 39ccc18..992eb1d 100644 --- a/app/controllers/collections_controller.ts +++ b/app/collections/controllers/collections_controller.ts @@ -1,10 +1,8 @@ -import Collection from '#models/collection'; -import User from '#models/user'; -import { - createCollectionValidator, - deleteCollectionValidator, - updateCollectionValidator, -} from '#validators/collection'; +import Collection from '#collections/models/collection'; +import { createCollectionValidator } from '#collections/validators/create_collection_validator'; +import { deleteCollectionValidator } from '#collections/validators/delete_collection_validator'; +import { updateCollectionValidator } from '#collections/validators/update_collection_validator'; +import User from '#user/models/user'; import type { HttpContext } from '@adonisjs/core/http'; import db from '@adonisjs/lucid/services/db'; diff --git a/app/enums/visibility.ts b/app/collections/enums/visibility.ts similarity index 100% rename from app/enums/visibility.ts rename to app/collections/enums/visibility.ts diff --git a/app/models/collection.ts b/app/collections/models/collection.ts similarity index 74% rename from app/models/collection.ts rename to app/collections/models/collection.ts index 8268083..0045751 100644 --- a/app/models/collection.ts +++ b/app/collections/models/collection.ts @@ -1,9 +1,9 @@ -import AppBaseModel from '#models/app_base_model'; -import Link from '#models/link'; -import User from '#models/user'; +import { Visibility } from '#collections/enums/visibility'; +import AppBaseModel from '#core/models/app_base_model'; +import Link from '#links/models/link'; +import User from '#user/models/user'; import { belongsTo, column, hasMany } from '@adonisjs/lucid/orm'; import type { BelongsTo, HasMany } from '@adonisjs/lucid/types/relations'; -import { Visibility } from '#enums/visibility'; export default class Collection extends AppBaseModel { @column() diff --git a/start/routes/collection.ts b/app/collections/routes/collections_routes.ts similarity index 94% rename from start/routes/collection.ts rename to app/collections/routes/collections_routes.ts index 6c9e6be..55331ed 100644 --- a/start/routes/collection.ts +++ b/app/collections/routes/collections_routes.ts @@ -1,7 +1,7 @@ import { middleware } from '#start/kernel'; import router from '@adonisjs/core/services/router'; const CollectionsController = () => - import('#controllers/collections_controller'); + import('#collections/controllers/collections_controller'); router .group(() => { diff --git a/app/collections/routes/routes.ts b/app/collections/routes/routes.ts new file mode 100644 index 0000000..a613619 --- /dev/null +++ b/app/collections/routes/routes.ts @@ -0,0 +1 @@ +import './collections_routes.js'; diff --git a/app/validators/collection.ts b/app/collections/validators/create_collection_validator.ts similarity index 51% rename from app/validators/collection.ts rename to app/collections/validators/create_collection_validator.ts index 37871bf..0432eb8 100644 --- a/app/validators/collection.ts +++ b/app/collections/validators/create_collection_validator.ts @@ -1,10 +1,6 @@ -import { Visibility } from '#enums/visibility'; +import { Visibility } from '#collections/enums/visibility'; import vine, { SimpleMessagesProvider } from '@vinejs/vine'; -const params = vine.object({ - id: vine.number(), -}); - export const createCollectionValidator = vine.compile( vine.object({ name: vine.string().trim().minLength(1).maxLength(254), @@ -14,23 +10,6 @@ export const createCollectionValidator = vine.compile( }) ); -export const updateCollectionValidator = vine.compile( - vine.object({ - name: vine.string().trim().minLength(1).maxLength(254), - description: vine.string().trim().maxLength(254).nullable(), - visibility: vine.enum(Visibility), - nextId: vine.number().optional(), - - params, - }) -); - -export const deleteCollectionValidator = vine.compile( - vine.object({ - params, - }) -); - createCollectionValidator.messagesProvider = new SimpleMessagesProvider({ name: 'Collection name is required', 'visibility.required': 'Collection visibiliy is required', diff --git a/app/collections/validators/delete_collection_validator.ts b/app/collections/validators/delete_collection_validator.ts new file mode 100644 index 0000000..1fc6f0d --- /dev/null +++ b/app/collections/validators/delete_collection_validator.ts @@ -0,0 +1,8 @@ +import { params } from '#core/validators/params_object'; +import vine from '@vinejs/vine'; + +export const deleteCollectionValidator = vine.compile( + vine.object({ + params, + }) +); diff --git a/app/collections/validators/update_collection_validator.ts b/app/collections/validators/update_collection_validator.ts new file mode 100644 index 0000000..36f8963 --- /dev/null +++ b/app/collections/validators/update_collection_validator.ts @@ -0,0 +1,14 @@ +import { Visibility } from '#collections/enums/visibility'; +import { params } from '#core/validators/params_object'; +import vine from '@vinejs/vine'; + +export const updateCollectionValidator = vine.compile( + vine.object({ + name: vine.string().trim().minLength(1).maxLength(254), + description: vine.string().trim().maxLength(254).nullable(), + visibility: vine.enum(Visibility), + nextId: vine.number().optional(), + + params, + }) +); diff --git a/app/controllers/apps_controller.ts b/app/controllers/apps_controller.ts deleted file mode 100644 index 43e33b4..0000000 --- a/app/controllers/apps_controller.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { PREFER_DARK_THEME } from '#constants/session'; -import { updateUserThemeValidator } from '#validators/user'; -import type { HttpContext } from '@adonisjs/core/http'; - -export default class AppsController { - async updateUserTheme({ request, session, response }: HttpContext) { - const { preferDarkTheme } = await request.validateUsing( - updateUserThemeValidator - ); - session.put(PREFER_DARK_THEME, preferDarkTheme); - return response.ok({ message: 'ok' }); - } -} diff --git a/app/constants/keys.ts b/app/core/constants/keys.ts similarity index 100% rename from app/constants/keys.ts rename to app/core/constants/keys.ts diff --git a/app/constants/paths.ts b/app/core/constants/paths.ts similarity index 100% rename from app/constants/paths.ts rename to app/core/constants/paths.ts diff --git a/app/exceptions/handler.ts b/app/core/exceptions/handler.ts similarity index 100% rename from app/exceptions/handler.ts rename to app/core/exceptions/handler.ts diff --git a/app/lib/cache.ts b/app/core/lib/cache.ts similarity index 100% rename from app/lib/cache.ts rename to app/core/lib/cache.ts diff --git a/app/middleware/container_bindings_middleware.ts b/app/core/middlewares/container_bindings_middleware.ts similarity index 100% rename from app/middleware/container_bindings_middleware.ts rename to app/core/middlewares/container_bindings_middleware.ts diff --git a/app/middleware/log_request.ts b/app/core/middlewares/log_request.ts similarity index 100% rename from app/middleware/log_request.ts rename to app/core/middlewares/log_request.ts diff --git a/app/models/app_base_model.ts b/app/core/models/app_base_model.ts similarity index 100% rename from app/models/app_base_model.ts rename to app/core/models/app_base_model.ts diff --git a/app/core/validators/params_object.ts b/app/core/validators/params_object.ts new file mode 100644 index 0000000..23a673a --- /dev/null +++ b/app/core/validators/params_object.ts @@ -0,0 +1,5 @@ +import vine from '@vinejs/vine'; + +export const params = vine.object({ + id: vine.number(), +}); diff --git a/app/controllers/favicons_controller.ts b/app/favicons/controllers/favicons_controller.ts similarity index 97% rename from app/controllers/favicons_controller.ts rename to app/favicons/controllers/favicons_controller.ts index 3094e9d..482377f 100644 --- a/app/controllers/favicons_controller.ts +++ b/app/favicons/controllers/favicons_controller.ts @@ -1,5 +1,5 @@ -import FaviconNotFoundException from '#exceptions/favicon_not_found_exception'; -import { cache } from '#lib/cache'; +import { cache } from '#core/lib/cache'; +import FaviconNotFoundException from '#favicons/exceptions/favicon_not_found_exception'; import type { HttpContext } from '@adonisjs/core/http'; import logger from '@adonisjs/core/services/logger'; import { parse } from 'node-html-parser'; diff --git a/app/exceptions/favicon_not_found_exception.ts b/app/favicons/exceptions/favicon_not_found_exception.ts similarity index 100% rename from app/exceptions/favicon_not_found_exception.ts rename to app/favicons/exceptions/favicon_not_found_exception.ts diff --git a/start/routes/favicon.ts b/app/favicons/routes/favicons_routes.ts similarity index 66% rename from start/routes/favicon.ts rename to app/favicons/routes/favicons_routes.ts index 431721d..d88b863 100644 --- a/start/routes/favicon.ts +++ b/app/favicons/routes/favicons_routes.ts @@ -1,5 +1,6 @@ import router from '@adonisjs/core/services/router'; -const FaviconsController = () => import('#controllers/favicons_controller'); +const FaviconsController = () => + import('#favicons/controllers/favicons_controller'); /** * Favicon routes diff --git a/app/favicons/routes/routes.ts b/app/favicons/routes/routes.ts new file mode 100644 index 0000000..c993b7a --- /dev/null +++ b/app/favicons/routes/routes.ts @@ -0,0 +1 @@ +import './favicons_routes.js'; diff --git a/app/home/routes/home_routes.ts b/app/home/routes/home_routes.ts new file mode 100644 index 0000000..3134e0b --- /dev/null +++ b/app/home/routes/home_routes.ts @@ -0,0 +1,3 @@ +import router from '@adonisjs/core/services/router'; + +router.on('/').renderInertia('home').as('home'); diff --git a/app/home/routes/routes.ts b/app/home/routes/routes.ts new file mode 100644 index 0000000..fb51e73 --- /dev/null +++ b/app/home/routes/routes.ts @@ -0,0 +1 @@ +import './home_routes.js'; diff --git a/app/legal/routes/legal_routes.ts b/app/legal/routes/legal_routes.ts new file mode 100644 index 0000000..a0ba963 --- /dev/null +++ b/app/legal/routes/legal_routes.ts @@ -0,0 +1,4 @@ +import router from '@adonisjs/core/services/router'; + +router.on('/terms').renderInertia('terms').as('terms'); +router.on('/privacy').renderInertia('privacy').as('privacy'); diff --git a/app/legal/routes/routes.ts b/app/legal/routes/routes.ts new file mode 100644 index 0000000..b7fa708 --- /dev/null +++ b/app/legal/routes/routes.ts @@ -0,0 +1 @@ +import './legal_routes.js'; diff --git a/app/controllers/links_controller.ts b/app/links/controllers/links_controller.ts similarity index 86% rename from app/controllers/links_controller.ts rename to app/links/controllers/links_controller.ts index ce36361..4a64234 100644 --- a/app/controllers/links_controller.ts +++ b/app/links/controllers/links_controller.ts @@ -1,13 +1,11 @@ -import CollectionsController from '#controllers/collections_controller'; -import Link from '#models/link'; -import { - createLinkValidator, - deleteLinkValidator, - updateLinkFavoriteStatusValidator, - updateLinkValidator, -} from '#validators/link'; +import CollectionsController from '#collections/controllers/collections_controller'; +import Link from '#links/models/link'; +import { createLinkValidator } from '#links/validators/create_link_validator'; +import { deleteLinkValidator } from '#links/validators/delete_link_validator'; +import { updateLinkFavoriteStatusValidator } from '#links/validators/update_favorite_link_validator'; +import { updateLinkValidator } from '#links/validators/update_link_validator'; import { inject } from '@adonisjs/core'; -import type { HttpContext } from '@adonisjs/core/http'; +import { HttpContext } from '@adonisjs/core/http'; import db from '@adonisjs/lucid/services/db'; @inject() diff --git a/app/models/link.ts b/app/links/models/link.ts similarity index 80% rename from app/models/link.ts rename to app/links/models/link.ts index 91c5e92..db42cbe 100644 --- a/app/models/link.ts +++ b/app/links/models/link.ts @@ -1,6 +1,6 @@ -import AppBaseModel from '#models/app_base_model'; -import Collection from '#models/collection'; -import User from '#models/user'; +import Collection from '#collections/models/collection'; +import AppBaseModel from '#core/models/app_base_model'; +import User from '#user/models/user'; import { belongsTo, column } from '@adonisjs/lucid/orm'; import type { BelongsTo } from '@adonisjs/lucid/types/relations'; diff --git a/start/routes/link.ts b/app/links/routes/links_routes.ts similarity index 91% rename from start/routes/link.ts rename to app/links/routes/links_routes.ts index cd59ba2..f7c01fe 100644 --- a/start/routes/link.ts +++ b/app/links/routes/links_routes.ts @@ -1,6 +1,6 @@ import { middleware } from '#start/kernel'; import router from '@adonisjs/core/services/router'; -const LinksController = () => import('#controllers/links_controller'); +const LinksController = () => import('#links/controllers/links_controller'); /** * Routes for authenticated users diff --git a/app/links/routes/routes.ts b/app/links/routes/routes.ts new file mode 100644 index 0000000..d1fff17 --- /dev/null +++ b/app/links/routes/routes.ts @@ -0,0 +1 @@ +import './links_routes.js'; diff --git a/app/links/validators/create_link_validator.ts b/app/links/validators/create_link_validator.ts new file mode 100644 index 0000000..6bef08e --- /dev/null +++ b/app/links/validators/create_link_validator.ts @@ -0,0 +1,11 @@ +import vine from '@vinejs/vine'; + +export const createLinkValidator = vine.compile( + vine.object({ + name: vine.string().trim().minLength(1).maxLength(254), + description: vine.string().trim().maxLength(300).optional(), + url: vine.string().trim(), + favorite: vine.boolean(), + collectionId: vine.number(), + }) +); diff --git a/app/links/validators/delete_link_validator.ts b/app/links/validators/delete_link_validator.ts new file mode 100644 index 0000000..1d5e179 --- /dev/null +++ b/app/links/validators/delete_link_validator.ts @@ -0,0 +1,8 @@ +import { params } from '#core/validators/params_object'; +import vine from '@vinejs/vine'; + +export const deleteLinkValidator = vine.compile( + vine.object({ + params, + }) +); diff --git a/app/links/validators/update_favorite_link_validator.ts b/app/links/validators/update_favorite_link_validator.ts new file mode 100644 index 0000000..81b2db2 --- /dev/null +++ b/app/links/validators/update_favorite_link_validator.ts @@ -0,0 +1,10 @@ +import { params } from '#core/validators/params_object'; +import vine from '@vinejs/vine'; + +export const updateLinkFavoriteStatusValidator = vine.compile( + vine.object({ + favorite: vine.boolean(), + + params, + }) +); diff --git a/app/links/validators/update_link_validator.ts b/app/links/validators/update_link_validator.ts new file mode 100644 index 0000000..0558918 --- /dev/null +++ b/app/links/validators/update_link_validator.ts @@ -0,0 +1,14 @@ +import { params } from '#core/validators/params_object'; +import vine from '@vinejs/vine'; + +export const updateLinkValidator = vine.compile( + vine.object({ + name: vine.string().trim().minLength(1).maxLength(254), + description: vine.string().trim().maxLength(300).optional(), + url: vine.string().trim(), + favorite: vine.boolean(), + collectionId: vine.number(), + + params, + }) +); diff --git a/app/controllers/searches_controller.ts b/app/search/controllers/search_controller.ts similarity index 91% rename from app/controllers/searches_controller.ts rename to app/search/controllers/search_controller.ts index 91db28e..1d3ca5c 100644 --- a/app/controllers/searches_controller.ts +++ b/app/search/controllers/search_controller.ts @@ -1,7 +1,7 @@ import type { HttpContext } from '@adonisjs/core/http'; import db from '@adonisjs/lucid/services/db'; -export default class SearchesController { +export default class SearchController { async search({ request, auth }: HttpContext) { const term = request.qs()?.term; if (!term) { diff --git a/app/search/routes/routes.ts b/app/search/routes/routes.ts new file mode 100644 index 0000000..4fda98e --- /dev/null +++ b/app/search/routes/routes.ts @@ -0,0 +1 @@ +import './search_routes.js'; diff --git a/start/routes/search.ts b/app/search/routes/search_routes.ts similarity index 75% rename from start/routes/search.ts rename to app/search/routes/search_routes.ts index c1a53db..fd4f20a 100644 --- a/start/routes/search.ts +++ b/app/search/routes/search_routes.ts @@ -1,7 +1,8 @@ import { middleware } from '#start/kernel'; import router from '@adonisjs/core/services/router'; -const SearchesController = () => import('#controllers/searches_controller'); +const SearchesController = () => + import('#search/controllers/search_controller'); /** * Search routes diff --git a/app/controllers/shared_collections_controller.ts b/app/shared_collections/controllers/shared_collections_controller.ts similarity index 83% rename from app/controllers/shared_collections_controller.ts rename to app/shared_collections/controllers/shared_collections_controller.ts index 8ee8899..a16c4f0 100644 --- a/app/controllers/shared_collections_controller.ts +++ b/app/shared_collections/controllers/shared_collections_controller.ts @@ -1,9 +1,9 @@ -import { Visibility } from '#enums/visibility'; -import Collection from '#models/collection'; -import Link from '#models/link'; -import User from '#models/user'; -import { getSharedCollectionValidator } from '#validators/shared_collection'; +import { Visibility } from '#collections/enums/visibility'; +import Collection from '#collections/models/collection'; +import Link from '#links/models/link'; +import User from '#user/models/user'; import type { HttpContext } from '@adonisjs/core/http'; +import { getSharedCollectionValidator } from '../validators/shared_collection.js'; class LinkWithoutFavoriteDto { constructor(private link: Link) {} diff --git a/app/shared_collections/routes/routes.ts b/app/shared_collections/routes/routes.ts new file mode 100644 index 0000000..070ae32 --- /dev/null +++ b/app/shared_collections/routes/routes.ts @@ -0,0 +1 @@ +import './shared_collections_routes.js'; diff --git a/start/routes/shared_collection.ts b/app/shared_collections/routes/shared_collections_routes.ts similarity index 70% rename from start/routes/shared_collection.ts rename to app/shared_collections/routes/shared_collections_routes.ts index ce021fb..1eb6a5f 100644 --- a/start/routes/shared_collection.ts +++ b/app/shared_collections/routes/shared_collections_routes.ts @@ -1,6 +1,6 @@ import router from '@adonisjs/core/services/router'; const SharedCollectionsController = () => - import('#controllers/shared_collections_controller'); + import('#shared_collections/controllers/shared_collections_controller'); router.get('/shared/:id', [SharedCollectionsController, 'index']).as('shared'); diff --git a/app/validators/shared_collection.ts b/app/shared_collections/validators/shared_collection.ts similarity index 68% rename from app/validators/shared_collection.ts rename to app/shared_collections/validators/shared_collection.ts index 6c47eb2..e963002 100644 --- a/app/validators/shared_collection.ts +++ b/app/shared_collections/validators/shared_collection.ts @@ -1,9 +1,6 @@ +import { params } from '#core/validators/params_object'; import vine from '@vinejs/vine'; -const params = vine.object({ - id: vine.number(), -}); - export const getSharedCollectionValidator = vine.compile( vine.object({ params, diff --git a/app/constants/session.ts b/app/user/constants/theme.ts similarity index 100% rename from app/constants/session.ts rename to app/user/constants/theme.ts diff --git a/app/user/controllers/theme_controller.ts b/app/user/controllers/theme_controller.ts new file mode 100644 index 0000000..2da56b3 --- /dev/null +++ b/app/user/controllers/theme_controller.ts @@ -0,0 +1,12 @@ +import { PREFER_DARK_THEME } from '#user/constants/theme'; +import { updateThemeValidator } from '#user/validators/update_theme_validator'; +import type { HttpContext } from '@adonisjs/core/http'; + +export default class ThemeController { + async index({ request, session, response }: HttpContext) { + const { preferDarkTheme } = + await request.validateUsing(updateThemeValidator); + session.put(PREFER_DARK_THEME, preferDarkTheme); + return response.ok({ message: 'ok' }); + } +} diff --git a/app/middleware/update_user_last_seen_middleware.ts b/app/user/middlewares/update_user_last_seen_middleware.ts similarity index 100% rename from app/middleware/update_user_last_seen_middleware.ts rename to app/user/middlewares/update_user_last_seen_middleware.ts diff --git a/app/models/user.ts b/app/user/models/user.ts similarity index 87% rename from app/models/user.ts rename to app/user/models/user.ts index ebc8ce7..1443385 100644 --- a/app/models/user.ts +++ b/app/user/models/user.ts @@ -1,9 +1,9 @@ -import Collection from '#models/collection'; -import Link from '#models/link'; +import Collection from '#collections/models/collection'; +import AppBaseModel from '#core/models/app_base_model'; +import Link from '#links/models/link'; import type { GoogleToken } from '@adonisjs/ally/types'; import { column, computed, hasMany } from '@adonisjs/lucid/orm'; import type { HasMany } from '@adonisjs/lucid/types/relations'; -import AppBaseModel from './app_base_model.js'; import { DateTime } from 'luxon'; export default class User extends AppBaseModel { diff --git a/app/user/routes/routes.ts b/app/user/routes/routes.ts new file mode 100644 index 0000000..1dcf892 --- /dev/null +++ b/app/user/routes/routes.ts @@ -0,0 +1 @@ +import './user_theme_route.js'; diff --git a/app/user/routes/user_theme_route.ts b/app/user/routes/user_theme_route.ts new file mode 100644 index 0000000..7386033 --- /dev/null +++ b/app/user/routes/user_theme_route.ts @@ -0,0 +1,5 @@ +import router from '@adonisjs/core/services/router'; + +const ThemeController = () => import('#user/controllers/theme_controller'); + +router.post('/user/theme', [ThemeController, 'index']).as('user.theme'); diff --git a/app/validators/user.ts b/app/user/validators/update_theme_validator.ts similarity index 62% rename from app/validators/user.ts rename to app/user/validators/update_theme_validator.ts index 7056af4..4ef1d84 100644 --- a/app/validators/user.ts +++ b/app/user/validators/update_theme_validator.ts @@ -1,6 +1,6 @@ import vine from '@vinejs/vine'; -export const updateUserThemeValidator = vine.compile( +export const updateThemeValidator = vine.compile( vine.object({ preferDarkTheme: vine.boolean(), }) diff --git a/app/validators/link.ts b/app/validators/link.ts deleted file mode 100644 index e68b154..0000000 --- a/app/validators/link.ts +++ /dev/null @@ -1,43 +0,0 @@ -import vine from '@vinejs/vine'; - -const params = vine.object({ - id: vine.number(), -}); - -export const createLinkValidator = vine.compile( - vine.object({ - name: vine.string().trim().minLength(1).maxLength(254), - description: vine.string().trim().maxLength(300).optional(), - url: vine.string().trim(), - favorite: vine.boolean(), - collectionId: vine.number(), - }) -); - -export const updateLinkValidator = vine.compile( - vine.object({ - name: vine.string().trim().minLength(1).maxLength(254), - description: vine.string().trim().maxLength(300).optional(), - url: vine.string().trim(), - favorite: vine.boolean(), - collectionId: vine.number(), - - params, - }) -); - -export const deleteLinkValidator = vine.compile( - vine.object({ - params, - }) -); - -export const updateLinkFavoriteStatusValidator = vine.compile( - vine.object({ - favorite: vine.boolean(), - - params: vine.object({ - id: vine.number(), - }), - }) -); diff --git a/config/auth.ts b/config/auth.ts index 86b8fe4..d0eef6d 100644 --- a/config/auth.ts +++ b/config/auth.ts @@ -1,6 +1,6 @@ import { defineConfig } from '@adonisjs/auth'; -import { InferAuthEvents, Authenticators } from '@adonisjs/auth/types'; import { sessionGuard, sessionUserProvider } from '@adonisjs/auth/session'; +import { Authenticators, InferAuthEvents } from '@adonisjs/auth/types'; const authConfig = defineConfig({ default: 'web', @@ -8,7 +8,7 @@ const authConfig = defineConfig({ web: sessionGuard({ useRememberMeTokens: false, provider: sessionUserProvider({ - model: () => import('#models/user'), + model: () => import('#user/models/user'), }), }), }, diff --git a/config/inertia.ts b/config/inertia.ts index 6942a0d..3ba86e8 100644 --- a/config/inertia.ts +++ b/config/inertia.ts @@ -1,7 +1,7 @@ import { - DARK_THEME_DEFAULT_VALUE, PREFER_DARK_THEME, -} from '#constants/session'; + DARK_THEME_DEFAULT_VALUE, +} from '#user/constants/theme'; import { defineConfig } from '@adonisjs/inertia'; export default defineConfig({ diff --git a/database/migrations/1714253983443_create_collections_table.ts b/database/migrations/1714253983443_create_collections_table.ts index 65f7d26..2072387 100644 --- a/database/migrations/1714253983443_create_collections_table.ts +++ b/database/migrations/1714253983443_create_collections_table.ts @@ -1,5 +1,5 @@ +import { Visibility } from '#collections/enums/visibility'; import { defaultTableFields } from '#database/default_table_fields'; -import { Visibility } from '#enums/visibility'; import { BaseSchema } from '@adonisjs/lucid/schema'; export default class CreateCollectionTable extends BaseSchema { diff --git a/database/seeders/collection_seeder.ts b/database/seeders/collection_seeder.ts index ed65c8e..7e6f2cf 100644 --- a/database/seeders/collection_seeder.ts +++ b/database/seeders/collection_seeder.ts @@ -1,6 +1,6 @@ -import { Visibility } from '#enums/visibility'; -import Collection from '#models/collection'; -import User from '#models/user'; +import { Visibility } from '#collections/enums/visibility'; +import Collection from '#collections/models/collection'; +import User from '#user/models/user'; import { BaseSeeder } from '@adonisjs/lucid/seeders'; import { faker } from '@faker-js/faker'; diff --git a/database/seeders/link_seeder.ts b/database/seeders/link_seeder.ts index a85e311..79d5806 100644 --- a/database/seeders/link_seeder.ts +++ b/database/seeders/link_seeder.ts @@ -1,7 +1,7 @@ +import Collection from '#collections/models/collection'; import { getUserIds } from '#database/seeders/collection_seeder'; -import Collection from '#models/collection'; -import Link from '#models/link'; -import User from '#models/user'; +import Link from '#links/models/link'; +import User from '#user/models/user'; import { BaseSeeder } from '@adonisjs/lucid/seeders'; import { faker } from '@faker-js/faker'; diff --git a/database/seeders/user_seeder.ts b/database/seeders/user_seeder.ts index 43ce731..5b42311 100644 --- a/database/seeders/user_seeder.ts +++ b/database/seeders/user_seeder.ts @@ -1,4 +1,4 @@ -import User from '#models/user'; +import User from '#user/models/user'; import { GoogleToken } from '@adonisjs/ally/types'; import { BaseSeeder } from '@adonisjs/lucid/seeders'; import { faker } from '@faker-js/faker'; diff --git a/inertia/components/dashboard/dashboard_header.tsx b/inertia/components/dashboard/dashboard_header.tsx index 7a63a31..fd3fdbb 100644 --- a/inertia/components/dashboard/dashboard_header.tsx +++ b/inertia/components/dashboard/dashboard_header.tsx @@ -1,4 +1,3 @@ -import { Visibility } from '#enums/visibility'; import { Link } from '@inertiajs/react'; import { route } from '@izzyjs/route/client'; import { @@ -19,6 +18,7 @@ import { IoTrashOutline } from 'react-icons/io5'; import { ShareCollection } from '~/components/share/share_collection'; import { appendCollectionId } from '~/lib/navigation'; import { useActiveCollection } from '~/stores/collection_store'; +import { Visibility } from '~/types/app'; interface DashboardHeaderProps { navbar: { diff --git a/inertia/components/footer/footer.tsx b/inertia/components/footer/footer.tsx index 46d4239..26cc8a3 100644 --- a/inertia/components/footer/footer.tsx +++ b/inertia/components/footer/footer.tsx @@ -1,4 +1,4 @@ -import PATHS from '#constants/paths'; +import PATHS from '#core/constants/paths'; import { Link } from '@inertiajs/react'; import { route } from '@izzyjs/route/client'; import { Anchor, Group, Text } from '@mantine/core'; diff --git a/inertia/components/form/form_collection.tsx b/inertia/components/form/form_collection.tsx index f286b1d..1460a83 100644 --- a/inertia/components/form/form_collection.tsx +++ b/inertia/components/form/form_collection.tsx @@ -1,10 +1,9 @@ -import { Visibility } from '#enums/visibility'; import { Box, Group, SegmentedControl, Text, TextInput } from '@mantine/core'; import { FormEvent } from 'react'; import { useTranslation } from 'react-i18next'; import BackToDashboard from '~/components/common/navigation/back_to_dashboard'; import { FormLayout, FormLayoutProps } from '~/layouts/form_layout'; -import { Collection } from '~/types/app'; +import { Collection, Visibility } from '~/types/app'; export type FormCollectionData = { name: string; diff --git a/inertia/components/navbar/navbar.tsx b/inertia/components/navbar/navbar.tsx index 3f4d5f3..f04ff91 100644 --- a/inertia/components/navbar/navbar.tsx +++ b/inertia/components/navbar/navbar.tsx @@ -1,4 +1,4 @@ -import PATHS from '#constants/paths'; +import PATHS from '#core/constants/paths'; import { Link } from '@inertiajs/react'; import { route } from '@izzyjs/route/client'; import { diff --git a/inertia/components/share/share_collection.tsx b/inertia/components/share/share_collection.tsx index 8a974d0..4fb2923 100644 --- a/inertia/components/share/share_collection.tsx +++ b/inertia/components/share/share_collection.tsx @@ -1,10 +1,10 @@ -import { Visibility } from '#enums/visibility'; import { ActionIcon, Anchor, CopyButton, Popover, Text } from '@mantine/core'; import { useTranslation } from 'react-i18next'; import { TbShare3 } from 'react-icons/tb'; import { Fragment } from 'react/jsx-runtime'; import { generateShareUrl } from '~/lib/navigation'; import { useActiveCollection } from '~/stores/collection_store'; +import { Visibility } from '~/types/app'; const COPY_SUCCESS_TIMEOUT = 2_000; diff --git a/inertia/hooks/use_shortcut.tsx b/inertia/hooks/use_shortcut.tsx index 3f20c92..776f326 100644 --- a/inertia/hooks/use_shortcut.tsx +++ b/inertia/hooks/use_shortcut.tsx @@ -1,4 +1,4 @@ -import KEYS from '#constants/keys'; +import KEYS from '#core/constants/keys'; import { useHotkeys } from 'react-hotkeys-hook'; import { useGlobalHotkeysStore } from '~/stores/global_hotkeys_store'; diff --git a/inertia/layouts/_base_layout.tsx b/inertia/layouts/_base_layout.tsx index e0503d1..105596b 100644 --- a/inertia/layouts/_base_layout.tsx +++ b/inertia/layouts/_base_layout.tsx @@ -1,8 +1,9 @@ -import { router } from '@inertiajs/react'; +import { router, usePage } from '@inertiajs/react'; import { ColorSchemeScript, createTheme, MantineProvider } from '@mantine/core'; import dayjs from 'dayjs'; import { ReactNode, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; +import { InertiaPage } from '~/types/inertia'; import '@mantine/core/styles.css'; import '@mantine/spotlight/styles.css'; @@ -14,6 +15,8 @@ const TRANSITION_OUT_CLASS = '__transition_fadeOut'; export default function BaseLayout({ children }: { children: ReactNode }) { const { i18n } = useTranslation(); + const { language } = usePage().props; + i18n.changeLanguage(language); dayjs.locale(i18n.language); const findAppElement = () => document.getElementById('app'); diff --git a/inertia/pages/collections/create.tsx b/inertia/pages/collections/create.tsx index e2619b0..5cc52ac 100644 --- a/inertia/pages/collections/create.tsx +++ b/inertia/pages/collections/create.tsx @@ -1,4 +1,3 @@ -import { Visibility } from '#enums/visibility'; import { useForm } from '@inertiajs/react'; import { route } from '@izzyjs/route/client'; import { useMemo } from 'react'; @@ -6,6 +5,7 @@ import { useTranslation } from 'react-i18next'; import MantineFormCollection, { FormCollectionData, } from '~/components/form/form_collection'; +import { Visibility } from '~/types/app'; export default function CreateCollectionPage({ disableHomeLink, diff --git a/inertia/tsconfig.json b/inertia/tsconfig.json index e000bf5..77d8195 100644 --- a/inertia/tsconfig.json +++ b/inertia/tsconfig.json @@ -2,21 +2,12 @@ "extends": "@adonisjs/tsconfig/tsconfig.client.json", "compilerOptions": { "baseUrl": ".", - "target": "ESNext", - "lib": ["dom", "dom.iterable", "esnext"], "module": "ESNext", - "moduleResolution": "Bundler", "jsx": "react-jsx", - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, "paths": { - "~/*": ["./*"], - "@/*": ["../*"] - }, - "types": ["vite/client"] + "~/*": ["./*"] + } }, "include": ["./**/*.ts", "./**/*.tsx"] } diff --git a/inertia/types/app.d.ts b/inertia/types/app.ts similarity index 53% rename from inertia/types/app.d.ts rename to inertia/types/app.ts index 79d716e..8499b78 100644 --- a/inertia/types/app.d.ts +++ b/inertia/types/app.ts @@ -1,12 +1,10 @@ -import { Visibility } from '@/app/enums/visibility'; - type CommonBase = { id: number; createdAt: string; updatedAt: string; }; -type User = CommonBase & { +export type User = CommonBase & { email: string; fullname: string; avatarUrl: string; @@ -14,15 +12,15 @@ type User = CommonBase & { lastSeenAt: string; }; -type PublicUser = Omit; +export type PublicUser = Omit; -type Users = User[]; +export type Users = User[]; -type UserWithCollections = User & { +export type UserWithCollections = User & { collections: Collection[]; }; -type UserWithRelationCount = CommonBase & { +export type UserWithRelationCount = CommonBase & { email: string; fullname: string; avatarUrl: string; @@ -32,7 +30,7 @@ type UserWithRelationCount = CommonBase & { lastSeenAt: string; }; -type Link = CommonBase & { +export type Link = CommonBase & { name: string; description: string | null; url: string; @@ -40,14 +38,14 @@ type Link = CommonBase & { collectionId: number; }; -type LinkWithCollection = Link & { +export type LinkWithCollection = Link & { collection: Collection; }; -type PublicLink = Omit; -type PublicLinkWithCollection = Omit; +export type PublicLink = Omit; +export type PublicLinkWithCollection = Omit; -type Collection = CommonBase & { +export type Collection = CommonBase & { name: string; description: string | null; visibility: Visibility; @@ -55,6 +53,11 @@ type Collection = CommonBase & { authorId: number; }; -type CollectionWithLinks = Collection & { +export type CollectionWithLinks = Collection & { links: Link[]; }; + +export enum Visibility { + PUBLIC = 'PUBLIC', + PRIVATE = 'PRIVATE', +} diff --git a/package.json b/package.json index 18dbfa5..1b2443a 100644 --- a/package.json +++ b/package.json @@ -15,25 +15,22 @@ "release": "release-it" }, "imports": { - "#controllers/*": "./app/controllers/*.js", - "#exceptions/*": "./app/exceptions/*.js", - "#models/*": "./app/models/*.js", - "#constants/*": "./app/constants/*.js", - "#enums/*": "./app/enums/*.js", - "#mails/*": "./app/mails/*.js", - "#services/*": "./app/services/*.js", - "#listeners/*": "./app/listeners/*.js", - "#events/*": "./app/events/*.js", - "#middleware/*": "./app/middleware/*.js", - "#validators/*": "./app/validators/*.js", + "#admin/*": "./app/admin/*.js", + "#auth/*": "./app/auth/*.js", + "#collections/*": "./app/collections/*.js", + "#core/*": "./app/core/*.js", + "#favicons/*": "./app/favicons/*.js", + "#home/*": "./app/home/*.js", + "#legal/*": "./app/legal/*.js", + "#links/*": "./app/links/*.js", + "#search/*": "./app/search/*.js", + "#shared_collections/*": "./app/shared_collections/*.js", + "#user/*": "./app/user/*.js", "#providers/*": "./providers/*.js", - "#policies/*": "./app/policies/*.js", - "#abilities/*": "./app/abilities/*.js", "#database/*": "./database/*.js", "#tests/*": "./tests/*.js", "#start/*": "./start/*.js", - "#config/*": "./config/*.js", - "#lib/*": "./app/lib/*.js" + "#config/*": "./config/*.js" }, "devDependencies": { "@adonisjs/assembler": "^7.8.2", @@ -100,8 +97,8 @@ }, "hotHook": { "boundaries": [ - "./app/controllers/**/*.ts", - "./app/middleware/*.ts" + "./app/**/controllers/*.ts", + "./app/**/middleware/*.ts" ] }, "prettier": { diff --git a/start/kernel.ts b/start/kernel.ts index e3c9522..d40caa8 100644 --- a/start/kernel.ts +++ b/start/kernel.ts @@ -15,7 +15,7 @@ import server from '@adonisjs/core/services/server'; * The error handler is used to convert an exception * to a HTTP response. */ -server.errorHandler(() => import('#exceptions/handler')); +server.errorHandler(() => import('#core/exceptions/handler')); /** * The server middleware stack runs middleware on all the HTTP @@ -23,9 +23,9 @@ server.errorHandler(() => import('#exceptions/handler')); * the request URL. */ server.use([ - () => import('#middleware/container_bindings_middleware'), + () => import('#core/middlewares/container_bindings_middleware'), () => import('@adonisjs/static/static_middleware'), - () => import('#middleware/log_request'), + () => import('#core/middlewares/log_request'), () => import('@adonisjs/cors/cors_middleware'), () => import('@adonisjs/vite/vite_middleware'), () => import('@adonisjs/inertia/inertia_middleware'), @@ -41,8 +41,8 @@ router.use([ () => import('@adonisjs/session/session_middleware'), () => import('@adonisjs/shield/shield_middleware'), () => import('@adonisjs/auth/initialize_auth_middleware'), - () => import('#middleware/silent_auth_middleware'), - () => import('#middleware/update_user_last_seen_middleware'), + () => import('#auth/middlewares/silent_auth_middleware'), + () => import('#user/middlewares/update_user_last_seen_middleware'), ]); /** @@ -50,7 +50,7 @@ router.use([ * the routes or the routes group. */ export const middleware = router.named({ - admin: () => import('#middleware/admin_middleware'), - guest: () => import('#middleware/guest_middleware'), - auth: () => import('#middleware/auth_middleware'), + admin: () => import('#admin/middlewares/is_admin_middleware'), + guest: () => import('#auth/middlewares/guest_middleware'), + auth: () => import('#auth/middlewares/auth_middleware'), }); diff --git a/start/routes.ts b/start/routes.ts index 16f8902..93eb0e2 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -1,8 +1,10 @@ -import './routes/admin.js'; -import './routes/app.js'; -import './routes/auth.js'; -import './routes/collection.js'; -import './routes/favicon.js'; -import './routes/link.js'; -import './routes/search.js'; -import './routes/shared_collection.js'; +import '#admin/routes/routes'; +import '#auth/routes/routes'; +import '#collections/routes/routes'; +import '#favicons/routes/routes'; +import '#home/routes/routes'; +import '#legal/routes/routes'; +import '#links/routes/routes'; +import '#search/routes/routes'; +import '#shared_collections/routes/routes'; +import '#user/routes/routes'; diff --git a/start/routes/app.ts b/start/routes/app.ts deleted file mode 100644 index 805c412..0000000 --- a/start/routes/app.ts +++ /dev/null @@ -1,15 +0,0 @@ -import router from '@adonisjs/core/services/router'; -const AppsController = () => import('#controllers/apps_controller'); - -/** - * All routes for both logged and guest users - */ -router.group(() => { - router.on('/').renderInertia('home').as('home'); - router.on('/terms').renderInertia('terms').as('terms'); - router.on('/privacy').renderInertia('privacy').as('privacy'); - - router - .post('/user/theme', [AppsController, 'updateUserTheme']) - .as('user.theme'); -});