1269 lines
44 KiB
PHP
1269 lines
44 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\SqlExam;
|
|
use App\SqlExamResult;
|
|
use App\SqlExamUser;
|
|
use App\SqlExercise;
|
|
use App\SqlExerciseResult;
|
|
use App\SqlExerciseUser;
|
|
use App\SqlLearning;
|
|
use App\SqlLearningUser;
|
|
use App\SqlLearningUserLog;
|
|
use App\SqlPractice;
|
|
use App\SqlPracticeQuestion;
|
|
use App\SqlPracticeUser;
|
|
use App\User;
|
|
use Exception;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use PDO;
|
|
|
|
class SQLController extends Controller
|
|
{
|
|
public function learning()
|
|
{
|
|
return view(Auth::user()->roleid . '.sql.learning');
|
|
}
|
|
public function learningRead($id = null)
|
|
{
|
|
switch (Auth::user()->roleid) {
|
|
case 'admin':
|
|
if ($id == null) {
|
|
$data = SqlLearning::all();
|
|
} else {
|
|
$data = SqlLearning::findOrFail($id);
|
|
}
|
|
break;
|
|
|
|
case 'student':
|
|
if ($id == null) {
|
|
$data = SqlLearning::select('*')
|
|
->selectRaw('COALESCE((SELECT sql_learning_users.status FROM sql_learning_users WHERE sql_learning_users.user_id = ' . Auth::user()->id . ' AND sql_learning_users.sql_learning_id = sql_learnings.id LIMIT 1), "Belum Dikerjakan") AS status')
|
|
->get();
|
|
} else {
|
|
$data = SqlLearning::findOrFail($id);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
$data = [];
|
|
break;
|
|
}
|
|
return $data;
|
|
}
|
|
public function learningStore(Request $request)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'name' => 'required',
|
|
'syntax' => 'required',
|
|
'file' => 'required',
|
|
], [
|
|
'required' => 'Silahkan isi bagian :attribute.',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return $validator->errors();
|
|
}
|
|
|
|
$file = $request->file('file');
|
|
$filename = uniqid() . '.' . $file->getClientOriginalExtension();
|
|
$file->move('upload', $filename);
|
|
|
|
$data = $validator->validated();
|
|
$data['file'] = 'upload/' . $filename;
|
|
|
|
SqlLearning::create($data);
|
|
return 'ok';
|
|
}
|
|
public function learningUpdate(Request $request, $id = null)
|
|
{
|
|
if ($id != null) {
|
|
$dataOld = SqlLearning::findOrFail($id);
|
|
$validator = Validator::make($request->all(), [
|
|
'name' => 'required',
|
|
'syntax' => 'required',
|
|
], [
|
|
'required' => 'Silahkan isi bagian :attribute.',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return $validator->errors();
|
|
}
|
|
$data = $validator->validated();
|
|
|
|
if ($request->hasFile('file')) {
|
|
$file = $request->file('file');
|
|
$filename = uniqid() . '.' . $file->getClientOriginalExtension();
|
|
$file->move('upload', $filename);
|
|
$data['file'] = 'upload/' . $filename;
|
|
|
|
if (file_exists(public_path($dataOld->file))) {
|
|
unlink(public_path($dataOld->file));
|
|
}
|
|
}
|
|
|
|
$dataOld->update($data);
|
|
return 'ok';
|
|
}
|
|
}
|
|
public function learningDelete($id = null)
|
|
{
|
|
if ($id != null) {
|
|
$data = SqlLearning::find($id);
|
|
if (file_exists(public_path($data->file))) {
|
|
unlink(public_path($data->file));
|
|
}
|
|
$data->delete();
|
|
}
|
|
}
|
|
public function learningDo($id = null)
|
|
{
|
|
$data = SqlLearning::findOrFail($id);
|
|
$userLearn = SqlLearningUser::where('user_id', Auth::user()->id)->where('sql_learning_id', $id)->first();
|
|
if (empty($userLearn)) {
|
|
$userLearn = SqlLearningUser::create([
|
|
'status' => 'sedang dikerjakan',
|
|
'sql_learning_id' => $id,
|
|
'user_id' => Auth::user()->id,
|
|
]);
|
|
}
|
|
$data['user'] = SqlLearningUser::where('user_id', Auth::user()->id)->where('sql_learning_id', $data->id)->with(['input' => function ($query) use($userLearn) {
|
|
$query->where('sql_learning_user_id', $userLearn->id)->orderBy('id', 'DESC')->limit(1);
|
|
}])->first();
|
|
$data['previous'] = SqlLearning::where('id', '<', $id)->max('id');
|
|
$data['next'] = SqlLearning::where('id', '>', $id)->min('id');
|
|
|
|
// return $data;
|
|
return view('student.sql.learning_do', ['data' => $data]);
|
|
}
|
|
public function learningDoReset()
|
|
{
|
|
$data = SqlLearning::get();
|
|
foreach ($data as $values) {
|
|
$id = $values->id;
|
|
$data['user'] = SqlLearningUser::where('sql_learning_id', $id)->where('user_id', Auth::user()->id);
|
|
$data['log'] = SqlLearningUserLog::whereIn('sql_learning_user_id', $data['user']->pluck('id')->toArray());
|
|
|
|
foreach ($data['log']->get() as $values) {
|
|
if ($values->rollback != '' && $values->status == 1) {
|
|
$this->sqlExec($values->rollback);
|
|
}
|
|
|
|
$values->delete();
|
|
}
|
|
|
|
$data['user']->delete();
|
|
}
|
|
}
|
|
public function learningDoExec(Request $request, $id = null)
|
|
{
|
|
if ($id != null) {
|
|
$validator = Validator::make($request->all(), [
|
|
'syntax' => 'required',
|
|
], [
|
|
'required' => 'Anda belum menuliskan apapun!',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return [
|
|
'status' => 'gagal',
|
|
[
|
|
'status' => 'gagal',
|
|
'message' => $validator->messages()->get('syntax')
|
|
]
|
|
];
|
|
}
|
|
|
|
$syntax = [];
|
|
$sql = $request->input('syntax');
|
|
// $sqlRaw = $this->syntaxParse($sql);
|
|
// $data = SqlLearning::findOrFail($id);
|
|
|
|
// $db = DB::select('SHOW DATABASES LIKE "%mahasiswa' . Auth::user()->id . '_%"');
|
|
// if (!empty($db)) {
|
|
// foreach ($db[0] as $key => $value) {
|
|
// DB::getPdo()->query('use ' . $value);
|
|
// }
|
|
// }
|
|
|
|
// $this->sqlExec($sqlRaw);
|
|
// $sql = $this->tapExec($data->syntax);
|
|
|
|
// $userLearn = new SqlLearningUser();
|
|
// $userLearn = $userLearn->where('user_id', Auth::user()->id)->where('sql_learning_id', $id)->firstOrFail();
|
|
// $userLearn->update(['status' => $sql['status']]);
|
|
|
|
$data = SqlLearning::findOrFail($id);
|
|
$user = SqlLearningUser::where('user_id', Auth::user()->id)->where('sql_learning_id', $id)->firstOrFail();
|
|
|
|
$db = DB::select('SHOW DATABASES LIKE "%pembelajaran_mahasiswa_' . Auth::user()->id . '_%"');
|
|
if (!empty($db)) {
|
|
foreach ($db[0] as $key => $value) {
|
|
$db = $value;
|
|
}
|
|
} else {
|
|
$db = 'sandbox';
|
|
}
|
|
|
|
DB::getPdo()->query('use ' . $db);
|
|
$syntax['user']['syntax'] = $this->syntaxParse($request->input('syntax'), 'pembelajaran');
|
|
$syntax['user']['rollback'] = $this->syntaxRollback($syntax['user']['syntax']);
|
|
$syntax['user']['result'] = $this->sqlExec($syntax['user']['syntax']);
|
|
|
|
$syntax['tap']['syntax'] = $data->syntax;
|
|
$syntax['tap']['result'] = $this->tapExec($syntax['tap']['syntax'], 'pembelajaran');
|
|
|
|
if ($user->status != 'lulus') {
|
|
$user->update(['status' => $syntax['tap']['result']['status']]);
|
|
}
|
|
|
|
if ($syntax['tap']['result']['status'] != 'lulus') {
|
|
DB::getPdo()->query('use ' . $db);
|
|
$this->sqlExec($syntax['user']['rollback']);
|
|
}
|
|
|
|
SqlLearningUserLog::create([
|
|
'syntax' => $syntax['user']['syntax'],
|
|
'rollback' => $syntax['user']['rollback'],
|
|
'result' => json_encode($syntax['tap']['result']),
|
|
'status' => (($syntax['tap']['result']['status'] == 'lulus') ? 1 : 0),
|
|
'sql_learning_user_id' => $user->id,
|
|
]);
|
|
|
|
return $syntax['tap']['result'];
|
|
}
|
|
|
|
return [
|
|
'status' => 0,
|
|
'error' => [
|
|
'syntax' => 'please check your queries'
|
|
]
|
|
];
|
|
}
|
|
public function learningLogRead($id = null)
|
|
{
|
|
$data = [];
|
|
if ($id == null) {
|
|
$users = SqlLearningUser::get()->pluck('user_id')->toArray();
|
|
$data = User::whereIn('id', $users)->get();
|
|
} else {
|
|
$data = SqlLearningUser::where('user_id', $id)->with(['input', 'user'])->get();
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
public function practice()
|
|
{
|
|
return view(Auth::user()->roleid . '.sql.practice');
|
|
}
|
|
public function practiceRead($id = null)
|
|
{
|
|
switch (Auth::user()->roleid) {
|
|
case 'admin':
|
|
if ($id == null) {
|
|
$data = SqlPractice::all();
|
|
} else {
|
|
$data = SqlPractice::with('question')->findOrFail($id);
|
|
}
|
|
break;
|
|
|
|
case 'student':
|
|
if ($id == null) {
|
|
$data = SqlPractice::select('*')
|
|
->selectRaw('(SELECT COUNT(*) FROM sql_practice_users WHERE sql_practice_users.user_id = "' . Auth::user()->id . '" AND sql_practice_users.correct IS NULL AND sql_practice_users.sql_practice_question_id IN (SELECT sql_practice_questions.id FROM sql_practice_questions WHERE sql_practice_questions.sql_practice_id = sql_practices.id)) AS ncomplete')
|
|
->selectRaw('(SELECT COUNT(*) FROM sql_practice_users WHERE sql_practice_users.user_id = "' . Auth::user()->id . '" AND sql_practice_users.correct IS NOT NULL AND sql_practice_users.sql_practice_question_id IN (SELECT sql_practice_questions.id FROM sql_practice_questions WHERE sql_practice_questions.sql_practice_id = sql_practices.id)) AS complete')
|
|
->selectRaw('(SELECT COUNT(*) FROM sql_practice_users WHERE sql_practice_users.user_id = "' . Auth::user()->id . '" AND sql_practice_users.correct = 1 AND sql_practice_users.sql_practice_question_id IN (SELECT sql_practice_questions.id FROM sql_practice_questions WHERE sql_practice_questions.sql_practice_id = sql_practices.id)) AS correct')
|
|
->get();
|
|
} else {
|
|
$data = SqlPractice::findOrFail($id);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
$data = [];
|
|
break;
|
|
}
|
|
return $data;
|
|
}
|
|
public function practiceStore(Request $request)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'name' => 'required',
|
|
'question' => 'required',
|
|
], [
|
|
'required' => 'Silahkan isi bagian :attribute.',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return $validator->errors();
|
|
}
|
|
|
|
$data = $validator->validated();
|
|
|
|
$sql = SqlPractice::create([
|
|
'name' => $data['name'],
|
|
'question' => sizeof($data['question'])
|
|
]);
|
|
if ($sql) {
|
|
foreach ($data['question'] as $value) {
|
|
$values = json_decode($value, true);
|
|
$values['sql_practice_id'] = $sql->id;
|
|
SqlPracticeQuestion::create($values);
|
|
}
|
|
}
|
|
return 'ok';
|
|
}
|
|
public function practiceUpdate(Request $request, $id = null)
|
|
{
|
|
if ($id != null) {
|
|
$dataOld = SqlPractice::findOrFail($id);
|
|
$validator = Validator::make($request->all(), [
|
|
'name' => 'required',
|
|
'question' => 'required',
|
|
], [
|
|
'required' => 'Silahkan isi bagian :attribute.',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return $validator->errors();
|
|
}
|
|
$data = $validator->validated();
|
|
|
|
$ids = [];
|
|
foreach ($data['question'] as $index => $value) {
|
|
$question = SqlPracticeQuestion::where('sql_practice_id', $id)->find($index);
|
|
$values = json_decode($value, true);
|
|
$values['sql_practice_id'] = $id;
|
|
if ($values['question'] != '' && $values['syntax'] != '') {
|
|
if (empty($question)) {
|
|
SqlPracticeQuestion::create($values);
|
|
} else {
|
|
$question->update($values);
|
|
}
|
|
$ids[] = $index;
|
|
}
|
|
}
|
|
|
|
SqlPracticeQuestion::where('sql_practice_id', $id)->whereNotIn('id', $ids)->delete();
|
|
|
|
$dataOld->update([
|
|
'name' => $data['name'],
|
|
'question' => sizeof($ids)
|
|
]);
|
|
|
|
|
|
return 'ok';
|
|
}
|
|
}
|
|
public function practiceDelete($id = null)
|
|
{
|
|
if ($id != null) {
|
|
$data = SqlPractice::find($id);
|
|
$data->delete();
|
|
}
|
|
}
|
|
public function practiceDo($id = null, $question = null)
|
|
{
|
|
$data = [];
|
|
if ($question == null) {
|
|
$query = SqlPracticeQuestion::where('sql_practice_id', $id)->get();
|
|
} else {
|
|
$query = SqlPracticeQuestion::where('sql_practice_id', $id)->where('id', $question)->get();
|
|
}
|
|
|
|
if (!empty($query)) {
|
|
$ids = $query->pluck('id')->toArray();
|
|
$userPractice = SqlPracticeUser::where('user_id', Auth::user()->id)->whereIn('sql_practice_question_id', $ids)->first();
|
|
$min = SqlPracticeQuestion::where('sql_practice_id', $id)->min('id');
|
|
if (empty($userPractice)) {
|
|
$userPractice = SqlPracticeUser::create([
|
|
'sql_practice_question_id' => $ids[0],
|
|
'user_id' => Auth::user()->id,
|
|
]);
|
|
}
|
|
|
|
if ($question == null) {
|
|
return redirect()->route('student sql practice do question', [$id, $ids[0]]);
|
|
}
|
|
|
|
$data['user'] = $userPractice;
|
|
$data['question'] = SqlPracticeQuestion::with('practice')->where('id', $data['user']->sql_practice_question_id)->firstOrFail();
|
|
$data['practice'] = $data['question']['id'] - $min + 1;
|
|
$data['previous'] = SqlPracticeQuestion::where('sql_practice_id', $id)->where('id', '<', $question)->max('id');
|
|
$data['next'] = SqlPracticeQuestion::where('sql_practice_id', $id)->where('id', '>', $question)->min('id');
|
|
|
|
// return $data;
|
|
return view('student.sql.practice_do', ['data' => $data]);
|
|
} else {
|
|
throw new Exception("Error Processing Request", 1);
|
|
}
|
|
}
|
|
public function practiceDoExec(Request $request, $id = null)
|
|
{
|
|
if ($id != null) {
|
|
$validator = Validator::make($request->all(), [
|
|
'syntax' => 'required',
|
|
], [
|
|
'required' => 'Anda belum menuliskan apapun!',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return [
|
|
'status' => 'gagal',
|
|
[
|
|
'status' => 'gagal',
|
|
'message' => $validator->messages()->get('syntax')
|
|
]
|
|
];
|
|
}
|
|
|
|
$syntax = [];
|
|
$sql = $request->input('syntax');
|
|
|
|
$data = SqlPracticeQuestion::findOrFail($id);
|
|
$user = SqlPracticeUser::where('user_id', Auth::user()->id)->where('sql_practice_question_id', $id)->firstOrFail();
|
|
|
|
$db = DB::select('SHOW DATABASES LIKE "%praktek_mahasiswa_' . Auth::user()->id . '_%"');
|
|
if (!empty($db)) {
|
|
foreach ($db[0] as $key => $value) {
|
|
$db = $value;
|
|
}
|
|
} else {
|
|
$db = 'sandbox';
|
|
}
|
|
|
|
DB::getPdo()->query('use ' . $db);
|
|
$syntax['user']['syntax'] = $this->syntaxParse($request->input('syntax'), 'praktek');
|
|
$syntax['user']['rollback'] = $this->syntaxRollback($syntax['user']['syntax']);
|
|
$syntax['user']['result'] = $this->sqlExec($syntax['user']['syntax']);
|
|
|
|
$syntax['tap']['syntax'] = $data->syntax;
|
|
$syntax['tap']['result'] = $this->tapExec($syntax['tap']['syntax'], 'praktek');
|
|
|
|
if ($user->correct != 1) {
|
|
switch ($syntax['tap']['result']['status']) {
|
|
case 'lulus':
|
|
$user->update([
|
|
'correct' => 1,
|
|
'syntax' => $syntax['user']['syntax'],
|
|
'result' => $syntax['tap']['result']
|
|
]);
|
|
break;
|
|
|
|
default:
|
|
$user->update([
|
|
'correct' => 0,
|
|
'syntax' => $syntax['user']['syntax'],
|
|
'result' => $syntax['tap']['result']
|
|
]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
DB::getPdo()->query('use ' . $db);
|
|
// $this->sqlExec($syntax['user']['rollback']);
|
|
|
|
return $syntax['tap']['result'];
|
|
}
|
|
|
|
return [
|
|
'status' => 0,
|
|
'error' => [
|
|
'syntax' => 'please check your queries'
|
|
]
|
|
];
|
|
}
|
|
public function practiceLogRead()
|
|
{
|
|
$data = [];
|
|
$datas = SqlPractice::with('questions')->get()->toArray();
|
|
foreach ($datas as $key => $value) {
|
|
$users = SqlPracticeUser::select('user_id')->distinct()->get()->pluck('user_id')->toArray();
|
|
foreach ($users as $index => $user) {
|
|
$practice = SqlPracticeUser::where('user_id', $user)->whereIn('sql_practice_question_id', array_column($value['questions'], 'id'))->whereNotNull('correct');
|
|
$all = $practice->count();
|
|
$correct = $practice->where('correct', 1)->count();
|
|
|
|
if ($all == $value['question']) {
|
|
if (!isset($data[$index])) {
|
|
$data[$index] = User::find($user)->toArray();
|
|
}
|
|
$data[$index]['practice'][] = [
|
|
'name' => $value['name'],
|
|
'nilai' => $correct / $all * 100,
|
|
];
|
|
}
|
|
}
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
public function exercise()
|
|
{
|
|
return view(Auth::user()->roleid . '.sql.exercise');
|
|
}
|
|
public function exerciseRead($id = null)
|
|
{
|
|
switch (Auth::user()->roleid) {
|
|
case 'admin':
|
|
if ($id == null) {
|
|
$data = SqlExercise::all();
|
|
} else {
|
|
$data = SqlExercise::findOrFail($id);
|
|
}
|
|
break;
|
|
|
|
case 'student':
|
|
if ($id == null) {
|
|
$data = SqlExerciseResult::where('user_id', Auth::user()->id)->where('status', 'selesai')->get();
|
|
} else {
|
|
$data = SqlExercise::findOrFail($id);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
$data = [];
|
|
break;
|
|
}
|
|
return $data;
|
|
}
|
|
public function exerciseStart()
|
|
{
|
|
$result = SqlExerciseResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first();
|
|
if (empty($result)) {
|
|
$result = SqlExerciseResult::create([
|
|
'status' => 'sedang dikerjakan',
|
|
'user_id' => Auth::user()->id
|
|
]);
|
|
}
|
|
|
|
$exercise = SqlExercise::first();
|
|
if (empty($exercise)) {
|
|
return redirect()->route('student sql exercise');
|
|
}
|
|
|
|
$input = SqlExerciseUser::where('sql_exercise_result_id', $result->id)->orderBy('id', 'DESC')->first();
|
|
if (empty($input)) {
|
|
$input = SqlExerciseUser::create([
|
|
'answer' => null,
|
|
'sql_exercise_id' => $exercise->id,
|
|
'sql_exercise_result_id' => $result->id,
|
|
]);
|
|
}
|
|
|
|
return redirect()->route('student sql exercise do', $input->sql_exercise_id);
|
|
}
|
|
public function exerciseDo($id = null)
|
|
{
|
|
$data = [];
|
|
|
|
$result = SqlExerciseResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first();
|
|
if (empty($result)) {
|
|
$result = SqlExerciseResult::create([
|
|
'status' => 'sedang dikerjakan',
|
|
'user_id' => Auth::user()->id
|
|
]);
|
|
}
|
|
|
|
$input = SqlExerciseUser::where('sql_exercise_id', $id)->where('sql_exercise_result_id', $result->id)->orderBy('id', 'DESC')->first();
|
|
if (empty($input)) {
|
|
$input = SqlExerciseUser::create([
|
|
'answer' => null,
|
|
'sql_exercise_id' => $id,
|
|
'sql_exercise_result_id' => $result->id,
|
|
]);
|
|
}
|
|
|
|
$exercise = SqlExercise::find($id);
|
|
if (!empty($exercise)) {
|
|
$data['semua'] = SqlExercise::orderBy('id', 'ASC')->get()->pluck('id')->toArray();
|
|
$data['terjawab'] = SqlExerciseUser::whereNotNull('answer')->where('sql_exercise_result_id', $result->id)->orderBy('sql_exercise_id', 'ASC')->get()->pluck('sql_exercise_id')->toArray();
|
|
$data['sekarang'] = $id;
|
|
$data['belum'] = SqlExercise::whereNotIn('id', $data['terjawab'])->orderBy('id', 'ASC')->get()->pluck('id')->toArray();
|
|
$data['next'] = SqlExercise::where('id', '>', $id)->min('id');
|
|
$data['soal'] = $exercise->question;
|
|
|
|
$jawaban[0] = $exercise->answer_1;
|
|
$jawaban[1] = $exercise->answer_2;
|
|
$jawaban[2] = $exercise->answer_3;
|
|
$jawaban[3] = $exercise->answer_4;
|
|
|
|
$data['input'] = null;
|
|
$userInput = null;
|
|
if (!empty($input) && $input->answer != null) {
|
|
$userInput = $jawaban[$input->answer - 1];
|
|
}
|
|
|
|
shuffle($jawaban);
|
|
|
|
if ($userInput != null) {
|
|
$data['input'] = array_search($userInput, $jawaban);
|
|
}
|
|
|
|
$data['jawaban'] = $jawaban;
|
|
|
|
return view('student.sql.exercise_do', ['data' => $data]);
|
|
}
|
|
|
|
return redirect()->route('student sql exercise');
|
|
}
|
|
public function exerciseDoDetail($id = null)
|
|
{
|
|
$data = [];
|
|
|
|
$exercise = SqlExercise::orderBy('id')->get();
|
|
foreach ($exercise as $key => $value) {
|
|
$user = SqlExerciseUser::where('sql_exercise_result_id', $id)->where('sql_exercise_id', $value->id)->first();
|
|
$jawaban = [];
|
|
$jawaban[0] = $value->answer_1;
|
|
$jawaban[1] = $value->answer_2;
|
|
$jawaban[2] = $value->answer_3;
|
|
$jawaban[3] = $value->answer_4;
|
|
|
|
$input = null;
|
|
|
|
if ($user != null && $user->answer != null) {
|
|
$input = $jawaban[$user->answer - 1];
|
|
}
|
|
|
|
shuffle($jawaban);
|
|
|
|
$correct = array_search($value->answer_1, $jawaban) + 1;
|
|
|
|
if ($input != null) {
|
|
$input = array_search($input, $jawaban) + 1;
|
|
}
|
|
|
|
$data[] = array(
|
|
'soal' => $value->question,
|
|
'jawaban_1' => $jawaban[0],
|
|
'jawaban_2' => $jawaban[1],
|
|
'jawaban_3' => $jawaban[2],
|
|
'jawaban_4' => $jawaban[3],
|
|
'input' => $input,
|
|
'correct' => $correct
|
|
);
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
public function exerciseAnswer(Request $request, $id = null)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'jawaban' => 'required',
|
|
], [
|
|
'required' => 'Silahkan isi bagian :attribute.',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return redirect()->back();
|
|
}
|
|
|
|
$result = SqlExerciseResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first();
|
|
if (empty($result)) {
|
|
$result = SqlExerciseResult::create([
|
|
'status' => 'sedang dikerjakan',
|
|
'user_id' => Auth::user()->id
|
|
]);
|
|
}
|
|
|
|
$input = SqlExerciseUser::where('sql_exercise_id', $id)->where('sql_exercise_result_id', $result->id)->orderBy('id', 'DESC')->first();
|
|
if (empty($input)) {
|
|
$input = SqlExerciseUser::create([
|
|
'answer' => null,
|
|
'sql_exercise_id' => $id,
|
|
'sql_exercise_result_id' => $result->id,
|
|
]);
|
|
}
|
|
|
|
$exercise = SqlExercise::find($id);
|
|
if (!empty($exercise)) {
|
|
$jawaban[0] = $exercise->answer_1;
|
|
$jawaban[1] = $exercise->answer_2;
|
|
$jawaban[2] = $exercise->answer_3;
|
|
$jawaban[3] = $exercise->answer_4;
|
|
|
|
$input->answer = array_search($request->input('jawaban'), $jawaban) + 1;
|
|
$input->save();
|
|
|
|
$next = SqlExercise::where('id', '>', $id)->min('id');
|
|
if ($next != null) {
|
|
return redirect()->route('student sql exercise do', $next);
|
|
} else {
|
|
$next = SqlExercise::min('id');
|
|
return redirect()->route('student sql exercise do', $next);
|
|
}
|
|
}
|
|
}
|
|
public function exerciseComplete()
|
|
{
|
|
$result = SqlExerciseResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first();
|
|
if (!empty($result)) {
|
|
$total = SqlExercise::count();
|
|
$benar = SqlExerciseUser::where('answer', 1)->where('sql_exercise_result_id', $result->id)->count();
|
|
|
|
$result->nilai = $benar / $total * 100;
|
|
$result->status = 'selesai';
|
|
$result->save();
|
|
|
|
return redirect()->route('student sql exercise');
|
|
}
|
|
|
|
return redirect()->back();
|
|
}
|
|
public function exerciseStore(Request $request)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'question' => 'required',
|
|
'answer_1' => 'required',
|
|
'answer_2' => 'required',
|
|
'answer_3' => 'required',
|
|
'answer_4' => 'required',
|
|
], [
|
|
'required' => 'Silahkan isi bagian :attribute.',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return $validator->errors();
|
|
}
|
|
|
|
$data = $validator->validated();
|
|
|
|
SqlExercise::create($data);
|
|
return 'ok';
|
|
}
|
|
public function exerciseUpdate(Request $request, $id = null)
|
|
{
|
|
if ($id != null) {
|
|
$dataOld = SqlExercise::findOrFail($id);
|
|
$validator = Validator::make($request->all(), [
|
|
'question' => 'required',
|
|
'answer_1' => 'required',
|
|
'answer_2' => 'required',
|
|
'answer_3' => 'required',
|
|
'answer_4' => 'required',
|
|
], [
|
|
'required' => 'Silahkan isi bagian :attribute.',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return $validator->errors();
|
|
}
|
|
$data = $validator->validated();
|
|
|
|
$dataOld->update($data);
|
|
return 'ok';
|
|
}
|
|
}
|
|
public function exerciseDelete($id = null)
|
|
{
|
|
if ($id != null) {
|
|
$data = SqlExercise::find($id);
|
|
$data->delete();
|
|
}
|
|
}
|
|
public function exerciseLogRead()
|
|
{
|
|
$data = [];
|
|
$users = SqlExerciseResult::get()->pluck('user_id')->toArray();
|
|
$data = User::whereIn('id', $users)->with('exercise')->get();
|
|
return $data;
|
|
}
|
|
|
|
public function exam()
|
|
{
|
|
return view(Auth::user()->roleid . '.sql.exam');
|
|
}
|
|
public function examRead($id = null)
|
|
{
|
|
switch (Auth::user()->roleid) {
|
|
case 'admin':
|
|
if ($id == null) {
|
|
$data = SqlExam::all();
|
|
} else {
|
|
$data = SqlExam::findOrFail($id);
|
|
}
|
|
break;
|
|
|
|
case 'student':
|
|
if ($id == null) {
|
|
$data = SqlExamResult::where('user_id', Auth::user()->id)->where('status', 'selesai')->get();
|
|
} else {
|
|
$data = SqlExam::findOrFail($id);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
$data = [];
|
|
break;
|
|
}
|
|
return $data;
|
|
}
|
|
public function examStart()
|
|
{
|
|
$result = SqlExamResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first();
|
|
if (empty($result)) {
|
|
$result = SqlExamResult::create([
|
|
'status' => 'sedang dikerjakan',
|
|
'user_id' => Auth::user()->id
|
|
]);
|
|
}
|
|
|
|
$exam = SqlExam::first();
|
|
if (empty($exam)) {
|
|
return redirect()->route('student sql exam');
|
|
}
|
|
|
|
$input = SqlExamUser::where('sql_exam_result_id', $result->id)->orderBy('id', 'DESC')->first();
|
|
if (empty($input)) {
|
|
$input = SqlExamUser::create([
|
|
'answer' => null,
|
|
'sql_exam_id' => $exam->id,
|
|
'sql_exam_result_id' => $result->id,
|
|
]);
|
|
}
|
|
|
|
return redirect()->route('student sql exam do', $input->sql_exam_id);
|
|
}
|
|
public function examDo($id = null)
|
|
{
|
|
$data = [];
|
|
|
|
$result = SqlExamResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first();
|
|
if (empty($result)) {
|
|
$result = SqlExamResult::create([
|
|
'status' => 'sedang dikerjakan',
|
|
'user_id' => Auth::user()->id
|
|
]);
|
|
}
|
|
|
|
$input = SqlExamUser::where('sql_exam_id', $id)->where('sql_exam_result_id', $result->id)->orderBy('id', 'DESC')->first();
|
|
if (empty($input)) {
|
|
$input = SqlExamUser::create([
|
|
'answer' => null,
|
|
'sql_exam_id' => $id,
|
|
'sql_exam_result_id' => $result->id,
|
|
]);
|
|
}
|
|
|
|
$exam = SqlExam::find($id);
|
|
if (!empty($exam)) {
|
|
$data['semua'] = SqlExam::orderBy('id', 'ASC')->get()->pluck('id')->toArray();
|
|
$data['terjawab'] = SqlExamUser::whereNotNull('answer')->where('sql_exam_result_id', $result->id)->orderBy('sql_exam_id', 'ASC')->get()->pluck('sql_exam_id')->toArray();
|
|
$data['sekarang'] = $id;
|
|
$data['belum'] = SqlExam::whereNotIn('id', $data['terjawab'])->orderBy('id', 'ASC')->get()->pluck('id')->toArray();
|
|
$data['next'] = SqlExam::where('id', '>', $id)->min('id');
|
|
$data['soal'] = $exam->question;
|
|
|
|
$jawaban[0] = $exam->answer_1;
|
|
$jawaban[1] = $exam->answer_2;
|
|
$jawaban[2] = $exam->answer_3;
|
|
$jawaban[3] = $exam->answer_4;
|
|
|
|
$data['input'] = null;
|
|
$userInput = null;
|
|
if (!empty($input) && $input->answer != null) {
|
|
$userInput = $jawaban[$input->answer - 1];
|
|
}
|
|
|
|
shuffle($jawaban);
|
|
|
|
if ($userInput != null) {
|
|
$data['input'] = array_search($userInput, $jawaban);
|
|
}
|
|
|
|
$data['jawaban'] = $jawaban;
|
|
|
|
return view('student.sql.exam_do', ['data' => $data]);
|
|
}
|
|
|
|
return redirect()->route('student sql exam');
|
|
}
|
|
public function examDoDetail($id = null)
|
|
{
|
|
$data = [];
|
|
|
|
$exam = SqlExam::orderBy('id')->get();
|
|
foreach ($exam as $key => $value) {
|
|
$user = SqlExamUser::where('sql_exam_result_id', $id)->where('sql_exam_id', $value->id)->first();
|
|
$jawaban = [];
|
|
$jawaban[0] = $value->answer_1;
|
|
$jawaban[1] = $value->answer_2;
|
|
$jawaban[2] = $value->answer_3;
|
|
$jawaban[3] = $value->answer_4;
|
|
|
|
$input = null;
|
|
|
|
if ($user != null && $user->answer != null) {
|
|
$input = $jawaban[$user->answer - 1];
|
|
}
|
|
|
|
shuffle($jawaban);
|
|
|
|
$correct = array_search($value->answer_1, $jawaban) + 1;
|
|
|
|
if ($input != null) {
|
|
$input = array_search($input, $jawaban) + 1;
|
|
}
|
|
|
|
$data[] = array(
|
|
'soal' => $value->question,
|
|
'jawaban_1' => $jawaban[0],
|
|
'jawaban_2' => $jawaban[1],
|
|
'jawaban_3' => $jawaban[2],
|
|
'jawaban_4' => $jawaban[3],
|
|
'input' => $input,
|
|
'correct' => $correct
|
|
);
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
public function examAnswer(Request $request, $id = null)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'jawaban' => 'required',
|
|
], [
|
|
'required' => 'Silahkan isi bagian :attribute.',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return redirect()->back();
|
|
}
|
|
|
|
$result = SqlExamResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first();
|
|
if (empty($result)) {
|
|
$result = SqlExamResult::create([
|
|
'status' => 'sedang dikerjakan',
|
|
'user_id' => Auth::user()->id
|
|
]);
|
|
}
|
|
|
|
$input = SqlExamUser::where('sql_exam_id', $id)->where('sql_exam_result_id', $result->id)->orderBy('id', 'DESC')->first();
|
|
if (empty($input)) {
|
|
$input = SqlExamUser::create([
|
|
'answer' => null,
|
|
'sql_exam_id' => $id,
|
|
'sql_exam_result_id' => $result->id,
|
|
]);
|
|
}
|
|
|
|
$exam = SqlExam::find($id);
|
|
if (!empty($exam)) {
|
|
$jawaban[0] = $exam->answer_1;
|
|
$jawaban[1] = $exam->answer_2;
|
|
$jawaban[2] = $exam->answer_3;
|
|
$jawaban[3] = $exam->answer_4;
|
|
|
|
$input->answer = array_search($request->input('jawaban'), $jawaban) + 1;
|
|
$input->save();
|
|
|
|
$next = SqlExam::where('id', '>', $id)->min('id');
|
|
if ($next != null) {
|
|
return redirect()->route('student sql exam do', $next);
|
|
} else {
|
|
$next = SqlExam::min('id');
|
|
return redirect()->route('student sql exam do', $next);
|
|
}
|
|
}
|
|
}
|
|
public function examComplete()
|
|
{
|
|
$result = SqlExamResult::where('user_id', Auth::user()->id)->where('status', 'sedang dikerjakan')->first();
|
|
if (!empty($result)) {
|
|
$total = SqlExam::count();
|
|
$benar = SqlExamUser::where('answer', 1)->where('sql_exam_result_id', $result->id)->count();
|
|
|
|
$result->nilai = $benar / $total * 100;
|
|
$result->status = 'selesai';
|
|
$result->save();
|
|
|
|
return redirect()->route('student sql exam');
|
|
}
|
|
|
|
return redirect()->back();
|
|
}
|
|
public function examStore(Request $request)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'question' => 'required',
|
|
'answer_1' => 'required',
|
|
'answer_2' => 'required',
|
|
'answer_3' => 'required',
|
|
'answer_4' => 'required',
|
|
], [
|
|
'required' => 'Silahkan isi bagian :attribute.',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return $validator->errors();
|
|
}
|
|
|
|
$data = $validator->validated();
|
|
|
|
SqlExam::create($data);
|
|
return 'ok';
|
|
}
|
|
public function examUpdate(Request $request, $id = null)
|
|
{
|
|
if ($id != null) {
|
|
$dataOld = SqlExam::findOrFail($id);
|
|
$validator = Validator::make($request->all(), [
|
|
'question' => 'required',
|
|
'answer_1' => 'required',
|
|
'answer_2' => 'required',
|
|
'answer_3' => 'required',
|
|
'answer_4' => 'required',
|
|
], [
|
|
'required' => 'Silahkan isi bagian :attribute.',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return $validator->errors();
|
|
}
|
|
$data = $validator->validated();
|
|
|
|
$dataOld->update($data);
|
|
return 'ok';
|
|
}
|
|
}
|
|
public function examDelete($id = null)
|
|
{
|
|
if ($id != null) {
|
|
$data = SqlExam::find($id);
|
|
$data->delete();
|
|
}
|
|
}
|
|
public function examLogRead()
|
|
{
|
|
$data = [];
|
|
$users = SqlExamResult::get()->pluck('user_id')->toArray();
|
|
$data = User::whereIn('id', $users)->with('exam')->get();
|
|
return $data;
|
|
}
|
|
|
|
protected function sqlExec($sql = '')
|
|
{
|
|
$result = [];
|
|
$sqlLines = explode(';', $sql);
|
|
foreach ($sqlLines as $key => $value) {
|
|
try {
|
|
DB::getPdo()->query($value);
|
|
} catch (\Throwable $th) {
|
|
continue;
|
|
}
|
|
}
|
|
DB::getPdo()->query('use ' . env('DB_DATABASE'));
|
|
return $result;
|
|
}
|
|
|
|
protected function tapExec($sql = '', $prefix = '')
|
|
{
|
|
$result = [];
|
|
$sql = explode(';', $sql);
|
|
$result['status'] = 'lulus';
|
|
foreach ($sql as $key => $value) {
|
|
try {
|
|
$value = $this->tapParse($value, $prefix);
|
|
$res = DB::connection('tap')->getPdo()->query($value)->fetchAll();
|
|
if (!empty($res) && str_contains(strtolower($res[0][0]), "ok") && str_contains(strtolower($res[0][0]), "-")) {
|
|
$resl = [
|
|
'message' => rtrim(substr($res[0][0], 0, (strpos($res[0][0], '#') != false) ? strpos($res[0][0], '#') : strlen($res[0][0]))),
|
|
'status' => 'lulus'
|
|
];
|
|
if (str_contains(strtolower($res[0][0]), "not ok")) {
|
|
$result['status'] = 'gagal';
|
|
$resl['status'] = 'gagal';
|
|
}
|
|
|
|
$result[] = $resl;
|
|
}
|
|
} catch (\Throwable $th) {
|
|
continue;
|
|
}
|
|
}
|
|
DB::getPdo()->query('use ' . env('DB_DATABASE'));
|
|
return $result;
|
|
}
|
|
|
|
protected function syntaxParse($sql = '', $prefix = '')
|
|
{
|
|
$needs = ['database', 'use'];
|
|
$lastPos = 0;
|
|
foreach ($needs as $key => $needle) {
|
|
while (($lastPos = stripos($sql, $needle, $lastPos)) !== false) {
|
|
$first = $lastPos + strlen($needle);
|
|
$last = $this->strposa($sql, [' ', ';', PHP_EOL], $first + 1);
|
|
if ($last == false) {
|
|
$last = strlen($sql);
|
|
}
|
|
|
|
$name = preg_replace('/\s+|;+/', '', substr($sql, $first, $last - $first));
|
|
// $sql = str_replace($name, 'user'.Auth::user()->id . '_' . $name, $sql);
|
|
|
|
$sql = substr_replace($sql, $prefix . '_mahasiswa_' . Auth::user()->id . '_' . $name, $first + 1, $last - $first - 1);
|
|
$lastPos = $first;
|
|
}
|
|
}
|
|
return $sql;
|
|
}
|
|
|
|
protected function syntaxRollback($sql = '')
|
|
{
|
|
$rollback = '';
|
|
$needs = ['create table', 'create database'];
|
|
$lastPos = 0;
|
|
foreach ($needs as $key => $needle) {
|
|
while (($lastPos = stripos($sql, $needle, $lastPos)) !== false) {
|
|
$first = $lastPos + strlen($needle) + 1;
|
|
$last = $this->strposa($sql, [' ', '(', ';', PHP_EOL], $first + 1);
|
|
if ($last == false) {
|
|
$last = strlen($sql);
|
|
}
|
|
|
|
$name = preg_replace('/\s+|;+/', '', substr($sql, $first, $last - $first));
|
|
|
|
$rollback .= str_replace('create', 'drop', $needle) . ' ' . $name . ';';
|
|
$lastPos = $last;
|
|
}
|
|
}
|
|
|
|
return $rollback;
|
|
}
|
|
|
|
protected function tapParse($sql = '', $prefix = '')
|
|
{
|
|
$needs = [
|
|
'has_schema',
|
|
'has_table',
|
|
'__hasnt_table',
|
|
'table_engine_is',
|
|
'table_collation_is',
|
|
'table_character_set_is',
|
|
'tables_are',
|
|
'table_sha1_is',
|
|
'has_column',
|
|
'hasnt_column',
|
|
'col_is_null',
|
|
'col_not_null',
|
|
'col_has_primary_key',
|
|
'col_hasnt_primary_key',
|
|
'col_has_index_key',
|
|
'col_hasnt_index_key',
|
|
'col_has_unique_index',
|
|
'col_hasnt_unique_index',
|
|
'col_has_named_index',
|
|
'col_has_pos_in_named_index',
|
|
'col_hasnt_pos_in_named_index',
|
|
'col_has_type',
|
|
'col_data_type_is',
|
|
'col_column_type_is',
|
|
'col_has_default',
|
|
'col_hasnt_default',
|
|
'col_default_is',
|
|
'col_extra_is',
|
|
'col_charset_is',
|
|
'col_character_set_is',
|
|
'col_collation_set_is',
|
|
'columns_are',
|
|
'has_routine',
|
|
'has_function',
|
|
'hasnt_function',
|
|
'has_procedure',
|
|
'function_data_type_is',
|
|
'function_is_deterministic',
|
|
'procedure_is_deterministic',
|
|
'function_security_type_is',
|
|
'procedure_security_type_is',
|
|
'function_sql_data_access_is',
|
|
'procedure_sql_data_access_is',
|
|
'routines_are',
|
|
'routine_has_sql_mode',
|
|
'routine_sha1_is',
|
|
'has_view',
|
|
'has_security_invoker',
|
|
'has_security_definer',
|
|
'view_security_type_is',
|
|
'view_check_option_is',
|
|
'view_is_updatable',
|
|
'view_definer_is',
|
|
'views_are',
|
|
'has_trigger',
|
|
'hasnt_trigger',
|
|
'trigger_event_is',
|
|
'trigger_timing_is',
|
|
'trigger_order',
|
|
'trigger_is',
|
|
'triggers_are',
|
|
'schema_collation_is',
|
|
'schema_character_set_is',
|
|
'schemas_are',
|
|
'has_event',
|
|
'hasnt_event',
|
|
'event_type_is',
|
|
'event_interval_value_is',
|
|
'event_interval_field_is',
|
|
'event_status_is',
|
|
'events_are',
|
|
'has_constraint',
|
|
'has_pk',
|
|
'hasnt_pk',
|
|
'has_fk',
|
|
'hasnt_fk',
|
|
'col_is_unique',
|
|
'col_is_pk',
|
|
'has_unique',
|
|
'constraint_type_is',
|
|
'fk_on_delete',
|
|
'fk_on_update',
|
|
'fk_ok',
|
|
'index_is',
|
|
'is_indexed',
|
|
'has_index',
|
|
'hasnt_index',
|
|
'index_is_type',
|
|
'indexes_are',
|
|
'has_partition',
|
|
'hasnt_partition',
|
|
'has_subpartition',
|
|
'hasnt_subpartition',
|
|
'partition_expression_is',
|
|
'subpartition_expression_is',
|
|
'partition_method_is',
|
|
'subpartition_method_is',
|
|
'partition_count_is',
|
|
'partitions_are',
|
|
];
|
|
$lastPos = 0;
|
|
foreach ($needs as $key => $needle) {
|
|
while (($lastPos = stripos($sql, $needle, $lastPos)) !== false) {
|
|
$first = $this->strposa($sql, ["'"], $lastPos);
|
|
$last = $this->strposa($sql, [','], $first);
|
|
if ($last == false) {
|
|
$last = strlen($sql);
|
|
}
|
|
|
|
$name = preg_replace("/\s+|;+|'+/", '', substr($sql, $first, $last - $first));
|
|
$sql = substr_replace($sql, "'" . $prefix . "_mahasiswa_" . Auth::user()->id . '_' . $name . "'", $first, $last - $first);
|
|
$lastPos = $lastPos + strlen($needle);
|
|
}
|
|
}
|
|
return $sql;
|
|
}
|
|
|
|
function strposa($haystack, $needles = array(), $offset = 0)
|
|
{
|
|
$chr = array();
|
|
foreach ($needles as $needle) {
|
|
$res = strpos($haystack, $needle, $offset);
|
|
if ($res !== false) $chr[$needle] = $res;
|
|
}
|
|
if (empty($chr)) return false;
|
|
return min($chr);
|
|
}
|
|
}
|