mirror of
https://github.com/sergeyyarkov/educt-server.git
synced 2026-10-11 10:19:20 +03:00
feat: added size column to lesson model & return materials to lesson response
This commit is contained in:
parent
11f0d30092
commit
14a89f77b3
@ -49,7 +49,7 @@ export default class LessonsController extends BaseController {
|
||||
* GET /lessons/:id
|
||||
*/
|
||||
public async show(ctx: HttpContextContract) {
|
||||
const result = await this.lessonService.fetchLesson(ctx.params.id);
|
||||
const result = await this.lessonService.fetchLesson(ctx.params.id, ctx);
|
||||
|
||||
if (!result.success && result.error) {
|
||||
throw new Exception(result.message, result.status, result.error.code);
|
||||
|
||||
@ -13,6 +13,9 @@ export default class LessonMaterial extends BaseModel {
|
||||
@column()
|
||||
public name: string;
|
||||
|
||||
@column()
|
||||
public size: number;
|
||||
|
||||
@column()
|
||||
public clientName: string;
|
||||
|
||||
|
||||
@ -157,7 +157,11 @@ export default class CourseRepository {
|
||||
* @returns List of lessons or null
|
||||
*/
|
||||
public async getLessons(id: string | number): Promise<Lesson[] | null> {
|
||||
const course = await this.Course.query().select('id').preload('lessons').where('id', id).first();
|
||||
const course = await this.Course.query()
|
||||
.select('id')
|
||||
.preload('lessons', q => q.preload('color').orderBy('display_order', 'asc'))
|
||||
.where('id', id)
|
||||
.first();
|
||||
return course && course.lessons;
|
||||
}
|
||||
|
||||
|
||||
@ -43,7 +43,7 @@ export default class LessonRepository {
|
||||
* @returns Lesson or null
|
||||
*/
|
||||
public async getById(id: string | number): Promise<Lesson | null> {
|
||||
const lesson = await this.Lesson.query().where('id', id).first();
|
||||
const lesson = await this.Lesson.query().where('id', id).preload('color').withCount('materials').first();
|
||||
return lesson;
|
||||
}
|
||||
|
||||
@ -119,6 +119,7 @@ export default class LessonRepository {
|
||||
const material = new LessonMaterial();
|
||||
|
||||
material.name = file.fileName;
|
||||
material.size = file.size;
|
||||
material.clientName = file.clientName;
|
||||
material.ext = file.extname;
|
||||
material.url = url;
|
||||
|
||||
@ -54,7 +54,7 @@ export default class LessonService {
|
||||
* @param id Lesson id
|
||||
* @returns Response
|
||||
*/
|
||||
public async fetchLesson(id: string | number): Promise<IResponse> {
|
||||
public async fetchLesson(id: string | number, ctx: HttpContextContract): Promise<IResponse> {
|
||||
const lesson = await this.lessonRepository.getById(id);
|
||||
|
||||
if (!lesson) {
|
||||
@ -69,6 +69,26 @@ export default class LessonService {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow user to view lesson content
|
||||
*/
|
||||
if (await ctx.bouncer.denies('viewLessonContent', lesson)) {
|
||||
return {
|
||||
success: false,
|
||||
status: HttpStatusEnum.FORBIDDEN,
|
||||
message: 'The user is not a student of this course.',
|
||||
data: {},
|
||||
error: {
|
||||
code: 'E_FORBIDDEN',
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Load lesson with materials
|
||||
*/
|
||||
await lesson.load(loader => loader.load('content').load('materials'));
|
||||
|
||||
return {
|
||||
success: true,
|
||||
status: HttpStatusEnum.OK,
|
||||
|
||||
@ -56,7 +56,7 @@ export const StudentFactory = Factory.define(User, ({ faker }) => makeFakeUser(f
|
||||
|
||||
export const LessonContentFactory = Factory.define(LessonContent, ({ faker }) => {
|
||||
return {
|
||||
video_url: `https://www.youtube.com/embed/${faker.datatype.string(10)}`,
|
||||
video_url: `/uploads/videos/${faker.datatype.string(10)}`,
|
||||
};
|
||||
}).build();
|
||||
|
||||
|
||||
@ -8,6 +8,7 @@ export default class LessonMaterials extends BaseSchema {
|
||||
table.increments('id').primary();
|
||||
table.string('url').notNullable();
|
||||
table.string('name').notNullable();
|
||||
table.integer('size').notNullable();
|
||||
table.string('client_name').notNullable();
|
||||
table.string('ext').notNullable();
|
||||
table.string('lesson_id', 21).unsigned().references('lessons.id').onDelete('CASCADE');
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user