refactor: split backend by context instead of type 'controllers/models/...'

This commit is contained in:
Sonny
2024-11-10 22:26:00 +01:00
parent 466c8dec3a
commit 01efb11f70
78 changed files with 230 additions and 228 deletions

View File

@@ -0,0 +1,46 @@
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 { HttpContext } from '@adonisjs/core/http';
class UserWithRelationCountDto {
constructor(private user: User) {}
toJson = () => ({
id: this.user.id,
email: this.user.email,
fullname: this.user.name,
avatarUrl: this.user.avatarUrl,
isAdmin: this.user.isAdmin,
createdAt: this.user.createdAt.toString(),
updatedAt: this.user.updatedAt.toString(),
lastSeenAt:
this.user.lastSeenAt?.toString() ?? this.user.updatedAt.toString(),
linksCount: Number(this.user.$extras.totalLinks),
collectionsCount: Number(this.user.$extras.totalCollections),
});
}
@inject()
export default class AdminController {
constructor(
protected usersController: AuthController,
protected linksController: LinksController,
protected collectionsController: CollectionsController
) {}
async index({ inertia }: HttpContext) {
const users = await this.usersController.getAllUsersWithTotalRelations();
const linksCount = await this.linksController.getTotalLinksCount();
const collectionsCount =
await this.collectionsController.getTotalCollectionsCount();
return inertia.render('admin/dashboard', {
users: users.map((user) => new UserWithRelationCountDto(user).toJson()),
totalLinks: linksCount,
totalCollections: collectionsCount,
});
}
}

View File

@@ -0,0 +1,11 @@
import type { HttpContext } from '@adonisjs/core/http';
import type { NextFn } from '@adonisjs/core/types/http';
export default class AdminMiddleware {
async handle(ctx: HttpContext, next: NextFn) {
if (!ctx.auth.user?.isAdmin) {
return ctx.response.redirectToNamedRoute('dashboard');
}
return next();
}
}

View File

@@ -0,0 +1,14 @@
import { middleware } from '#start/kernel';
import router from '@adonisjs/core/services/router';
const AdminController = () => import('#admin/controllers/admin_controller');
/**
* Routes for admin dashboard
*/
router
.group(() => {
router.get('/', [AdminController, 'index']).as('admin.dashboard');
})
.middleware([middleware.auth(), middleware.admin()])
.prefix('/admin');

View File

@@ -0,0 +1 @@
import './admin_routes.js';