mirror of
https://github.com/Sonny93/my-links.git
synced 2025-12-10 07:25:35 +00:00
refactor: split backend by context instead of type 'controllers/models/...'
This commit is contained in:
46
app/admin/controllers/admin_controller.ts
Normal file
46
app/admin/controllers/admin_controller.ts
Normal 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,
|
||||
});
|
||||
}
|
||||
}
|
||||
11
app/admin/middlewares/is_admin_middleware.ts
Normal file
11
app/admin/middlewares/is_admin_middleware.ts
Normal 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();
|
||||
}
|
||||
}
|
||||
14
app/admin/routes/admin_routes.ts
Normal file
14
app/admin/routes/admin_routes.ts
Normal 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');
|
||||
1
app/admin/routes/routes.ts
Normal file
1
app/admin/routes/routes.ts
Normal file
@@ -0,0 +1 @@
|
||||
import './admin_routes.js';
|
||||
Reference in New Issue
Block a user