mirror of
https://github.com/Sonny93/my-links.git
synced 2025-12-10 07:25:35 +00:00
feat: add basic admin dashboard
This commit is contained in:
42
app/controllers/admin_controller.ts
Normal file
42
app/controllers/admin_controller.ts
Normal file
@@ -0,0 +1,42 @@
|
||||
import UsersController from '#controllers/users_controller';
|
||||
import User from '#models/user';
|
||||
import { inject } from '@adonisjs/core';
|
||||
import type { HttpContext } from '@adonisjs/core/http';
|
||||
import db from '@adonisjs/lucid/services/db';
|
||||
|
||||
class UserWithRelationCountDto {
|
||||
constructor(private user: User) {}
|
||||
|
||||
public toJson() {
|
||||
return {
|
||||
id: this.user.id,
|
||||
email: this.user.email,
|
||||
fullname: this.user.name,
|
||||
avatarUrl: this.user.avatarUrl,
|
||||
isAdmin: this.user.isAdmin,
|
||||
createdAt: this.user.createdAt,
|
||||
updatedAt: this.user.updatedAt,
|
||||
count: {
|
||||
link: Number(this.user.$extras.totalLinks),
|
||||
collection: Number(this.user.$extras.totalCollections),
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@inject()
|
||||
export default class AdminController {
|
||||
constructor(protected usersController: UsersController) {}
|
||||
|
||||
async index({ inertia }: HttpContext) {
|
||||
const users = await this.usersController.getAllUsersWithTotalRelations();
|
||||
const links = await db.from('links').count('* as total');
|
||||
const collections = await db.from('collections').count('* as total');
|
||||
|
||||
return inertia.render('admin/dashboard', {
|
||||
users: users.map((user) => new UserWithRelationCountDto(user).toJson()),
|
||||
totalLinks: Number(links[0].total),
|
||||
totalCollections: Number(collections[0].total),
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
import User from '#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 {
|
||||
@@ -30,6 +31,7 @@ export default class UsersController {
|
||||
return response.redirectToNamedRoute(this.redirectTo);
|
||||
}
|
||||
|
||||
const userCount = await db.from('users').count('* as total');
|
||||
const {
|
||||
email,
|
||||
id: providerId,
|
||||
@@ -50,6 +52,7 @@ export default class UsersController {
|
||||
avatarUrl,
|
||||
token,
|
||||
providerType: 'google',
|
||||
isAdmin: userCount[0].total === '0',
|
||||
}
|
||||
);
|
||||
|
||||
@@ -66,4 +69,10 @@ export default class UsersController {
|
||||
logger.info(`[${auth.user?.email}] disconnected successfully`);
|
||||
response.redirectToNamedRoute(this.redirectTo);
|
||||
}
|
||||
|
||||
async getAllUsersWithTotalRelations() {
|
||||
return User.query()
|
||||
.withCount('collections', (q) => q.as('totalCollections'))
|
||||
.withCount('links', (q) => q.as('totalLinks'));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user