diff --git a/app/Controllers/Http/Api/v1/StatController.ts b/app/Controllers/Http/Api/v1/StatController.ts new file mode 100644 index 0000000..92291f7 --- /dev/null +++ b/app/Controllers/Http/Api/v1/StatController.ts @@ -0,0 +1,31 @@ +import { Exception, inject, Ioc } from '@adonisjs/core/build/standalone'; +import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'; +import StatService from 'App/Services/StatService'; + +import BaseController from '../../BaseController'; + +@inject() +export default class StatController extends BaseController { + private statService: StatService; + + constructor(statService: StatService) { + super(); + this.statService = statService; + } + + /** + * Return current stat about system + * GET /stat + */ + public async index(ctx: HttpContextContract) { + const result = await this.statService.fetchStatData(); + + if (!result.success && result.error) { + throw new Exception(result.message, result.status, result.error.code); + } + + return this.sendResponse(ctx, result.data, result.message, result.status); + } +} + +new Ioc().make(StatController); diff --git a/app/Services/StatService.ts b/app/Services/StatService.ts new file mode 100644 index 0000000..2dff00b --- /dev/null +++ b/app/Services/StatService.ts @@ -0,0 +1,33 @@ +import { inject, Ioc } from '@adonisjs/core/build/standalone'; +import IResponse from 'App/Datatypes/Interfaces/IResponse'; +import HttpStatusEnum from 'App/Datatypes/Enums/HttpStatusEnum'; +import Database from '@ioc:Adonis/Lucid/Database'; + +@inject() +export default class StatService { + /** + * Get basic statistics about the system + * + * @returns Response + */ + // eslint-disable-next-line class-methods-use-this + public async fetchStatData(): Promise { + const count = await Database.rawQuery( + ` + select (select count(*) from courses) as courses_count, + (select count(*) from lessons) as lessons_count + ` + ); + + return { + success: true, + status: HttpStatusEnum.OK, + message: 'Fetched stat.', + data: { + ...count.rows[0], + }, + }; + } +} + +new Ioc().make(StatService); diff --git a/routes/apis/v1/index.ts b/routes/apis/v1/index.ts index d868e88..a967e66 100644 --- a/routes/apis/v1/index.ts +++ b/routes/apis/v1/index.ts @@ -63,6 +63,11 @@ Route.group(() => { * */ require('./categories'); + + /** + * Stat module + */ + require('./stat'); }).middleware('auth'); }) .prefix('v1') diff --git a/routes/apis/v1/stat.ts b/routes/apis/v1/stat.ts new file mode 100644 index 0000000..109a29e --- /dev/null +++ b/routes/apis/v1/stat.ts @@ -0,0 +1,5 @@ +import Route from '@ioc:Adonis/Core/Route'; + +Route.group(() => { + Route.get('/', 'Api/v1/StatController.index').middleware('role:admin,teacher,student').as('stat.index'); +}).prefix('stat');