You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

119 lines
3.8 KiB

<?php
namespace App\Services;
use App\Http\Resources\ExerciseResource;
use App\Models\Exercise;
use App\Models\ExerciseSkill;
use App\Models\Question;
use App\Models\QuestionBlank;
use App\Models\QuestionChoice;
use App\Models\QuestionGroup;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Support\Facades\DB;
class ExerciseService
{
public function getExercises($params)
{
$limit = isset($params['limit']) ? min((int)$params['limit'], 100) : 10;
$offset = isset($params['offset']) ? max((int)$params['offset'], 0) : 0;
$lessonName = $params['search'] ?? null;
$query = Exercise::select('id', 'lesson_name', 'description', 'status', 'level', 'year', 'created_at');
if (!empty($lessonName)) {
$query->where('lesson_name', 'like', '%' . $lessonName . '%');
}
// Lấy dữ liệu chính
$data = $query->orderByDesc('created_at')
->skip($offset)
->take($limit)
->get()
->map(function ($item) {
$item->level = match ((int)$item->level) {
0 => 'easy',
1 => 'normal',
2 => 'hard',
default => 'unknown',
};
return $item;
});
return $data;
}
public function createExercise($dataExercise)
{
$dataCreateExercise = [
'lesson_name' => $dataExercise['name'] ?? null,
'description' => $dataExercise['description'] ?? null,
'subject_id' => $dataExercise['subject_id'] ?? null,
'level' => $dataExercise['level'] ?? null,
'status' => $dataExercise['status'] ?? null,
'category_id' => $dataExercise['category_id'] ?? null,
'year' => $dataExercise['year'] ?? null,
];
$exercise = Exercise::create($dataCreateExercise);
return $exercise->id;
}
public function detail($id)
{
$exercise = Exercise::with([
'skills:id,name',
'questionGroups' => function ($q) {
$q->select('id', 'exercise_id', 'content');
},
'questionGroups.questions' => function ($q) {
$q->select('id', 'content', 'group_id', 'question_type_id', 'description', 'score', 'explanation', 'hint');
},
'questionGroups.questions.type:id,code,name',
'questionGroups.questions.choices',
'questionGroups.questions.blanks',
])->findOrFail($id);
return new ExerciseResource($exercise);
}
public function destroy($id)
{
try {
$exercise = Exercise::findOrFail($id);
DB::transaction(function () use ($exercise) {
$groupIds = $exercise->questionGroups()->pluck('id');
$questionIds = DB::table('se_questions')
->whereIn('group_id', $groupIds)
->pluck('id');
QuestionChoice::whereIn('question_id', $questionIds)->delete();
QuestionBlank::whereIn('question_id', $questionIds)->delete();
Question::whereIn('id', $questionIds)->delete();
QuestionGroup::whereIn('id', $groupIds)->delete();
ExerciseSkill::where('exercise_id', $exercise->id)->delete();
$exercise->delete();
});
return [
'status' => true,
'message' => 'Xoá đề thi thành công.'
];
} catch (ModelNotFoundException $e) {
return [
'status' => false,
'message' => 'Không tìm thấy đề thi.'
];
} catch (\Exception $e) {
return [
'status' => false,
'message' => 'Lỗi hệ thống: ' . $e->getMessage()
];
}
}
}