Skip to content

Commit

Permalink
Thông báo bằng Email, Notify
Browse files Browse the repository at this point in the history
  • Loading branch information
ngtin590 committed Oct 18, 2024
1 parent 56bb5ca commit 05ca4f8
Show file tree
Hide file tree
Showing 26 changed files with 1,372 additions and 179 deletions.
176 changes: 176 additions & 0 deletions app/Http/Controllers/Api/Candidates/JobSeekersController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
<?php

namespace App\Http\Controllers\Api\Candidates;

use App\Http\Controllers\Controller;
use App\Mail\JobApplied;
use App\Models\Job;
use App\Models\Objective;
use App\Notifications\JobApplicationSubmitted;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Storage;

class JobSeekersController extends Controller
{
public function saveJob(Request $request, $id)
{
$job = Job::findOrFail($id);
$user = $request->user();

// Kiểm tra xem công việc đã được thêm vào danh sách yêu thích của người dùng chưa
if ($user->favorites()->where('job_id', $job->id)->exists()) {
return response()->json(['message' => 'Công việc đã lưu trước đó'], 200);
} else {
// Nếu công việc chưa được thêm vào danh sách yêu thích, thực hiện thêm mới
$user->favorites()->syncWithoutDetaching([$job->id]);
return response()->json([
'success' => 'true',
'message' => 'Đã lưu công việc vào danh sách yêu thích',
'status_code' => 200
], 200);
}
}


/**
* Unsave Job from favorite table
*/
public function unsaveJob(Request $request, $id)
{
$job = Job::findOrFail($id);
$user = $request->user();
$user->favorites()->detach($job->id);

return response()->json([
'success' => 'true',
'message' => 'Xóa công việc đã lưu thành công',
'status_code' => 200,
], 200);
}

/**
* Get list of saved jobs
*/
public function savedJobs(Request $request)
{
$user = Auth::user();
$savedJobs = $user->favorites;

$savedJobsData = $savedJobs->map(function ($job) {
return [
'id' => $job->id,
'title' => $job->title,
'featured' => ($job->featured == 1) ? 'Tuyển gấp' : 'Không có',
'is_hot' => ($job->views > 100) ? 'HOT' : 'Không hot', // Kiểm tra lượt xem

'company' => $job->company->company_name,
'logo' => $job->company->logo,
'salary' => [
'salary_from' => $job->salary_from,
'salary_to' => $job->salary_to
],
'city' => $job->city->name,
'last_date' => \Carbon\Carbon::parse($job->last_date)->format('d-m-Y'),
];
});

return response()->json([
'success' => true,
'message' => 'Saved jobs',
'data' => $savedJobsData,
'status_code' => 200
], 200);
}

public function apply(Request $request, $id)
{
$job = Job::find($id);
if (!$job) {
return response()->json(['message' => 'Công việc không tồn tại.'], 404);
}

$user = Auth::guard('sanctum')->user();
if (!$user) {
return response()->json(['message' => 'Unauthorized'], 401);
}

if ($job->users()->where('users.id', $user->id)->exists()) {
return response()->json([
'message' => 'Bạn đã ứng tuyển công việc này rồi.',
'status_code' => 409
], 409);
}

// Kiểm tra xem người dùng đã chọn CV có sẵn hay upload CV mới
if ($request->has('selected_cv_id')) {
// Người dùng chọn một CV có sẵn
$selectedCv = Objective::find($request->selected_cv_id);

$cvFileName = $selectedCv->file;
} elseif ($request->hasFile('cv')) {
// Người dùng tải lên CV mới
$cv = $request->file('cv');
$cvFileName = time() . '_' . $cv->getClientOriginalName();
$cv->storeAs('public/cv', $cvFileName);
} else {
// Không có CV nào được chọn hoặc tải lên
return response()->json(['message' => 'Vui lòng chọn hoặc tải lên CV.'], 400);
}

// Lấy thông tin name, phone, email từ request
$name = $request->input('name');
$phone = $request->input('phone');
$email = $request->input('email');

// Tiếp tục quá trình ứng tuyển
Mail::to($user->email)->send(new JobApplied($job, $user, $cvFileName));
$job->company->notify(new JobApplicationSubmitted($job, $user, $name, $phone, $email));

// Thêm thông tin vào bảng job_user
$job->users()->attach($user->id, [
'status' => 'pending',
'cv' => $cvFileName,
'name' => $name, // Thêm trường name
'phone' => $phone, // Thêm trường phone
'email' => $email // Thêm trường email
]);

// Gửi thông báo cho nhà tuyển dụng
// $job->company->notify(new JobApplicationSubmitted($job, $user));

return response()->json([
'success' => true,
'message' => 'Ứng tuyển công việc thành công.',
'status_code' => 200,
], 200);
}

public function getUserCvs(Request $request)
{
$user = $request->user();

// Lấy danh sách CV từ profile của người dùng
$cvs = $user->profile->objectives;

// Tạo một mảng để chứa dữ liệu CV
$customData = $cvs->map(function ($cv) {
return [
'id' => $cv->id,
'desired_position' => $cv->desired_position,
'attached_file' => $cv->file ? 'Hồ sơ đính kèm' : 'Hồ sơ trực tuyến', // Lấy URL tệp đính kèm
];
});


return response()->json([
'success' => true,
'data' => $customData,
'message' => 'Danh sách CV của người dùng đã được lấy thành công.'
]);
}



}
90 changes: 86 additions & 4 deletions app/Http/Controllers/Api/Companies/JobsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use App\Http\Controllers\Controller;
use App\Mail\JobApplied;
use App\Models\Company;
use App\Models\Job;
use App\Utillities\Constant;
use Auth;
Expand Down Expand Up @@ -422,8 +423,8 @@ public function showJob(Job $job)
'title' => $relatedJob['job']->title,
'city' => $relatedJob['job']->city->name,
'company' => $relatedJob['job']->company->company_name,
'created_at' => $relatedJob['job']->created_at->format('Y-m-d'),
'score' => $relatedJob['score'], // Hiển thị điểm số
'last_date' =>$relatedJob['job']->last_date,
'score' => $relatedJob['score'],
];
});

Expand Down Expand Up @@ -565,7 +566,7 @@ public function search(Request $request)
'salary_to' => $job->salary_to
],
'city' => $job->city->name,
'created_at' => \Carbon\Carbon::parse($job->created_at)->format('Y-m-d'),
'last_date' => \Carbon\Carbon::parse($job->last_date)->format('d-m-Y'),
];
}),
'suggested_jobs' => $suggestedJobs,
Expand Down Expand Up @@ -642,9 +643,90 @@ private function getSuggestedJobs()
'salary_to' => $job->salary_to
],
'city' => $job->city->name,
'created_at' => \Carbon\Carbon::parse($job->created_at)->format('Y-m-d'),
'last_date' => \Carbon\Carbon::parse($job->last_date)->format('d-m-Y'),
];
});
}

public function getNotifications()
{
$user = auth()->user();
$companyId = $user->companies->id;
// Tìm công ty dựa trên ID
$company = Company::find($companyId);
if (!$company) {
return response()->json(['message' => 'Công ty không tồn tại.'], 404);
}

// Lấy tất cả thông báo cho công ty
$notifications = $company->notifications; // Hoặc sử dụng phương thức `notifications` nếu có

// Nếu không có thông báo nào
if ($notifications->isEmpty()) {
return response()->json(['message' => 'Không có thông báo nào.'], 204);
}

$customData = $notifications->map(function ($notification) {
return [
'job_id' => $notification->data['job_id'],
'job_title' => $notification->data['job_title'],
'user_id' => $notification->data['user_id'],
'user_name' => $notification->data['user_name'],
'applicant_name' => $notification->data['applicant_name'],
'applicant_phone' => $notification->data['applicant_phone'],
'applicant_email' => $notification->data['applicant_email'],

'notification_id' => $notification->id,
'read_at' => $notification->read_at,
'created_at' => $notification->created_at->format('Y-m-d H:i:s'),
];
});

return response()->json([
'success' => true,
'message' => 'Lấy thông báo thành công',
'data' => $customData,
'status_code' => 200
]);
}


public function markAsRead(Request $request)
{
$user = auth()->user();
$companyId = $user->companies->id;

// Tìm công ty dựa trên ID
$company = Company::find($companyId);
if (!$company) {
return response()->json(['message' => 'Công ty không tồn tại.'], 404);
}

// Lấy thông báo cụ thể nếu có ID được gửi lên
$notificationId = $request->input('notification_id');

if ($notificationId) {
// Tìm thông báo dựa trên ID
$notification = $company->notifications()->where('id', $notificationId)->first();

if (!$notification) {
return response()->json(['message' => 'Thông báo không tồn tại.'], 404);
}

// Đánh dấu thông báo này là đã đọc
$notification->markAsRead();
} else {
// Đánh dấu tất cả thông báo là đã đọc nếu không có ID nào được gửi lên
$company->notifications()->whereNull('read_at')->get()->markAsRead();
}

return response()->json([
'success' => true,
'message' => 'Đánh dấu thông báo đã đọc thành công',
'status_code' => 200
]);
}



}
60 changes: 60 additions & 0 deletions app/Http/Controllers/Api/Employer/CandidatesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use App\Models\Candidate;
use App\Models\Objective;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class CandidatesController extends Controller
{
Expand Down Expand Up @@ -173,5 +174,64 @@ public function show(Request $request, $id)
]);
}

public function apply(Request $request, $id)
{
$job = Job::find($id);
if (!$job) {
return response()->json(['message' => 'Công việc không tồn tại.'], 404);
}

$user = Auth::guard('sanctum')->user();
if (!$user) {
return response()->json(['message' => 'Unauthorized'], 401);
}

if ($job->users()->where('users.id', $user->id)->exists()) {
return response()->json([
'message' => 'Bạn đã ứng tuyển công việc này rồi.',
'status_code' => 409
], 409);
}

// Kiểm tra xem người dùng đã chọn CV có sẵn hay upload CV mới
if ($request->has('selected_cv_id')) {
// Người dùng chọn một CV có sẵn
$selectedCv = Cv::find($request->selected_cv_id);
if (!$selectedCv || $selectedCv->users_id != $user->id) {
return response()->json(['message' => 'CV không hợp lệ.'], 400);
}
$cvFileName = $selectedCv->file_path;
} elseif ($request->hasFile('cv')) {
// Người dùng tải lên CV mới
$cv = $request->file('cv');
$cvFileName = time() . '_' . $cv->getClientOriginalName();
$cv->storeAs('public/cv', $cvFileName);
} else {
// Không có CV nào được chọn hoặc tải lên
return response()->json(['message' => 'Vui lòng chọn hoặc tải lên CV.'], 400);
}

// Tiếp tục quá trình ứng tuyển
Mail::to($user->email)->send(new JobApplied($job, $user, $cvFileName));
$job->users()->attach($user->id, ['status' => 'pending', 'cv' => $cvFileName]);

return response()->json([
'success' => true,
'message' => 'Ứng tuyển công việc thành công.',
'status_code' => 200,
], 200);
}

public function getUserCvs(Request $request)
{
$user = $request->user();
$cvs = $user->cvs; // Giả sử người dùng có mối quan hệ hasMany với CVs

return response()->json([
'success' => true,
'cvs' => $cvs
]);
}


}
Loading

0 comments on commit 05ca4f8

Please sign in to comment.