mirror of
https://github.com/sergeyyarkov/educt-server.git
synced 2026-10-11 18:29:15 +03:00
feat: added save-order route
This commit is contained in:
parent
4ac06f2c24
commit
14122905d6
@ -1,6 +1,7 @@
|
|||||||
import Application from '@ioc:Adonis/Core/Application';
|
import Application from '@ioc:Adonis/Core/Application';
|
||||||
import { Exception, inject, Ioc } from '@adonisjs/core/build/standalone';
|
import { Exception, inject, Ioc } from '@adonisjs/core/build/standalone';
|
||||||
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext';
|
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext';
|
||||||
|
import { schema } from '@ioc:Adonis/Core/Validator';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Services
|
* Services
|
||||||
@ -137,6 +138,25 @@ export default class LessonsController extends BaseController {
|
|||||||
|
|
||||||
return this.sendResponse(ctx, data, message, status);
|
return this.sendResponse(ctx, data, message, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save order of lessons
|
||||||
|
* POST /lessons/save-order
|
||||||
|
*/
|
||||||
|
// eslint-disable-next-line class-methods-use-this
|
||||||
|
public async saveOrder(ctx: HttpContextContract) {
|
||||||
|
const saveOrderSchema = schema.create({
|
||||||
|
ids: schema.array().members(schema.string()),
|
||||||
|
});
|
||||||
|
const payload = await ctx.request.validate({ schema: saveOrderSchema });
|
||||||
|
const { data, message, status, success, error } = await this.lessonService.updateOrder(payload.ids);
|
||||||
|
|
||||||
|
if (!success && error) {
|
||||||
|
throw new Exception(message, status, error.code);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.sendResponse(ctx, data, message, status);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
new Ioc().make(LessonsController);
|
new Ioc().make(LessonsController);
|
||||||
|
|||||||
@ -17,7 +17,7 @@ export default class Lesson extends BaseModel {
|
|||||||
@column()
|
@column()
|
||||||
public title: string;
|
public title: string;
|
||||||
|
|
||||||
@column()
|
@column({ serializeAs: null })
|
||||||
public display_order: number;
|
public display_order: number;
|
||||||
|
|
||||||
@column()
|
@column()
|
||||||
|
|||||||
@ -82,7 +82,7 @@ export default class CourseRepository {
|
|||||||
.preload('teacher')
|
.preload('teacher')
|
||||||
.preload('color')
|
.preload('color')
|
||||||
.preload('category')
|
.preload('category')
|
||||||
.preload('lessons', q => q.preload('color'))
|
.preload('lessons', q => q.preload('color').orderBy('display_order', 'asc'))
|
||||||
.preload('students')
|
.preload('students')
|
||||||
.where('id', id)
|
.where('id', id)
|
||||||
.first();
|
.first();
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext';
|
|||||||
*/
|
*/
|
||||||
import HttpStatusEnum from 'App/Datatypes/Enums/HttpStatusEnum';
|
import HttpStatusEnum from 'App/Datatypes/Enums/HttpStatusEnum';
|
||||||
import IResponse from 'App/Datatypes/Interfaces/IResponse';
|
import IResponse from 'App/Datatypes/Interfaces/IResponse';
|
||||||
|
import Lesson from 'App/Models/Lesson';
|
||||||
import LessonMaterial from 'App/Models/LessonMaterial';
|
import LessonMaterial from 'App/Models/LessonMaterial';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -264,6 +265,28 @@ export default class LessonService {
|
|||||||
data: lesson.content,
|
data: lesson.content,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line class-methods-use-this
|
||||||
|
public async updateOrder(ids: string[]): Promise<IResponse<{}>> {
|
||||||
|
/**
|
||||||
|
* Update order of lessons
|
||||||
|
*/
|
||||||
|
// TODO can be transformed into one query
|
||||||
|
await Promise.all(
|
||||||
|
ids.map(async (id, i) => {
|
||||||
|
await Lesson.query()
|
||||||
|
.where('id', id)
|
||||||
|
.update({ display_order: i + 1 });
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
status: HttpStatusEnum.OK,
|
||||||
|
message: 'Order updated.',
|
||||||
|
data: {},
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
new Ioc().make(LessonService);
|
new Ioc().make(LessonService);
|
||||||
|
|||||||
@ -64,6 +64,7 @@ export const LessonFactory = Factory.define(Lesson, ({ faker }) => {
|
|||||||
return {
|
return {
|
||||||
title: faker.lorem.sentence(6),
|
title: faker.lorem.sentence(6),
|
||||||
description: faker.lorem.sentence(7),
|
description: faker.lorem.sentence(7),
|
||||||
|
display_order: 1,
|
||||||
duration: DateTime.fromObject({
|
duration: DateTime.fromObject({
|
||||||
hour: faker.datatype.number(2),
|
hour: faker.datatype.number(2),
|
||||||
minute: faker.datatype.number({ min: 30, max: 59 }),
|
minute: faker.datatype.number({ min: 30, max: 59 }),
|
||||||
|
|||||||
@ -11,7 +11,7 @@ export default class Colors extends BaseSchema {
|
|||||||
.enu('name', Object.keys(ColorEnum), {
|
.enu('name', Object.keys(ColorEnum), {
|
||||||
useNative: true,
|
useNative: true,
|
||||||
enumName: 'color_name_enum',
|
enumName: 'color_name_enum',
|
||||||
existingType: true,
|
existingType: false,
|
||||||
schemaName: 'public',
|
schemaName: 'public',
|
||||||
})
|
})
|
||||||
.notNullable();
|
.notNullable();
|
||||||
@ -20,6 +20,7 @@ export default class Colors extends BaseSchema {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async down() {
|
public async down() {
|
||||||
|
await this.schema.raw('DROP TYPE IF EXISTS "color_name_enum" CASCADE');
|
||||||
this.schema.dropTable(this.tableName);
|
this.schema.dropTable(this.tableName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,7 +21,7 @@ export default class Courses extends BaseSchema {
|
|||||||
.enu('status', Object.values(CourseStatusEnum), {
|
.enu('status', Object.values(CourseStatusEnum), {
|
||||||
useNative: true,
|
useNative: true,
|
||||||
enumName: 'course_status_enum',
|
enumName: 'course_status_enum',
|
||||||
existingType: true,
|
existingType: false,
|
||||||
schemaName: 'public',
|
schemaName: 'public',
|
||||||
})
|
})
|
||||||
.notNullable();
|
.notNullable();
|
||||||
@ -31,7 +31,7 @@ export default class Courses extends BaseSchema {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async down() {
|
public async down() {
|
||||||
await this.schema.raw('DROP TYPE IF EXISTS "course_status" CASCADE');
|
await this.schema.raw('DROP TYPE IF EXISTS "course_status_enum" CASCADE');
|
||||||
this.schema.dropTable(this.tableName);
|
this.schema.dropTable(this.tableName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,7 @@ export default class CourseSeeder extends BaseSeeder {
|
|||||||
public async run() {
|
public async run() {
|
||||||
this.CourseFactory = CourseFactory;
|
this.CourseFactory = CourseFactory;
|
||||||
|
|
||||||
await this.CourseFactory.with('lessons', 2, lessonFactory => lessonFactory.with('content'))
|
await this.CourseFactory.with('lessons', 10, lessonFactory => lessonFactory.with('content'))
|
||||||
.with('category')
|
.with('category')
|
||||||
.with('teacher')
|
.with('teacher')
|
||||||
.createMany(3);
|
.createMany(3);
|
||||||
|
|||||||
@ -3,6 +3,9 @@ import Route from '@ioc:Adonis/Core/Route';
|
|||||||
Route.group(() => {
|
Route.group(() => {
|
||||||
Route.get('/', 'Api/v1/LessonsController.list').middleware('role:admin,teacher,student').as('lessons.list');
|
Route.get('/', 'Api/v1/LessonsController.list').middleware('role:admin,teacher,student').as('lessons.list');
|
||||||
Route.post('/', 'Api/v1/LessonsController.create').middleware('role:admin,teacher').as('lessons.create');
|
Route.post('/', 'Api/v1/LessonsController.create').middleware('role:admin,teacher').as('lessons.create');
|
||||||
|
Route.post('/save-order', 'Api/v1/LessonsController.saveOrder')
|
||||||
|
.middleware('role:admin,teacher')
|
||||||
|
.as('lessons.update-order');
|
||||||
Route.get('/:id', 'Api/v1/LessonsController.show').middleware('role:admin,teacher,student').as('lessons.show');
|
Route.get('/:id', 'Api/v1/LessonsController.show').middleware('role:admin,teacher,student').as('lessons.show');
|
||||||
Route.delete('/:id', 'Api/v1/LessonsController.delete').middleware('role:admin,teacher').as('lessons.delete');
|
Route.delete('/:id', 'Api/v1/LessonsController.delete').middleware('role:admin,teacher').as('lessons.delete');
|
||||||
Route.put('/:id', 'Api/v1/LessonsController.update').middleware('role:admin,teacher').as('lessons.update');
|
Route.put('/:id', 'Api/v1/LessonsController.update').middleware('role:admin,teacher').as('lessons.update');
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user