このリポジトリは2023-09-09にアーカイブされています。 ファイルの閲覧とクローンは可能ですが、プッシュ、イシューの作成、プルリクエストはできません。
kikikan/backend/app/Http/Controllers/Api/ChildrenController.php

521 行
19 KiB
PHP
Raw 通常表示 履歴

<?php
namespace App\Http\Controllers\Api;
2021-10-25 20:16:43 +09:00
use App\Http\Controllers\Controller, Session;
2021-10-15 10:37:47 +09:00
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Hash;
use Illuminate\Http\Request;
2021-10-15 10:37:47 +09:00
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use App\Models\Child;
use App\Models\FatherRelation;
use App\Models\MeetingApprovals;
2021-10-29 17:32:00 +09:00
use App\Models\TelActivation;
2021-10-29 17:51:41 +09:00
use App\Notifications\SmsNotification;
class ChildrenController extends Controller {
2021-10-25 20:16:43 +09:00
use AuthenticationTrait;
use AuthorizationTrait;
/* Traitで使うメソッド */
protected function getGuard () {
2021-10-30 23:13:12 +09:00
return 'children';
2021-10-25 20:16:43 +09:00
}
protected function getModel () {
2021-10-25 22:38:06 +09:00
return new \App\Models\Child();
2021-10-25 20:16:43 +09:00
}
2021-10-15 10:37:47 +09:00
public function registerTemporary (Request $r) {
2021-11-10 11:42:07 +09:00
// 電話番号の文字数。
Validator::extend('tel_size', function ($attribute, $value, $params, $validator) {
try {
return strlen((string)$value) == 10 || strlen((string)$value) == 11;
} catch (\Throwable $e) {
Log::critical($e->getMessage());
return false;
}
});
2021-10-15 10:37:47 +09:00
$validate = Validator::make($r->all(), [
2021-11-10 11:42:07 +09:00
'tel' => 'required|unique:children|numeric|starts_with:0|tel_size'
2021-10-15 10:37:47 +09:00
]);
2021-11-10 11:42:07 +09:00
2021-10-15 10:37:47 +09:00
if ($validate->fails()) {
// バリデーションエラー
return ['status_code' => 422, 'error_messages' => $validate->errors()];
}
2021-10-29 17:32:00 +09:00
if ($get = TelActivation::where('tel', $r->tel)->first()) {
2021-10-15 10:37:47 +09:00
// すでにDBに登録されている場合
return ['status_code' => 400, 'error_messages' => ['既に使用されている電話番号です。']];
}
2021-11-03 01:59:03 +09:00
$token = bin2hex(random_bytes(8));
2021-10-29 17:51:41 +09:00
$create = [
'type' => 0,
'tel' => $r->tel,
'token' => $token,
'ttl' => date('Y-m-d H:i:s', time()+28800),
];
2021-10-15 10:37:47 +09:00
try {
2021-10-29 17:32:00 +09:00
// DBに入ります。
2021-10-29 17:51:41 +09:00
TelActivation::create($create);
// SMSを送ります。
2021-11-05 18:20:36 +09:00
$message = 'KIKI承知システムの招待URLが届きました。
▼招待URLはコチラ
https://kikikan.jp/c-account/register/'.$token.'
KIKI承知システムを使って「聞いてない」「言ってない」などの問題を解決しよう。';
\Notification::route('nexmo', '81'.substr($r->tel, 1))->notify(new SmsNotification($message));
2021-10-15 10:37:47 +09:00
} catch (\Throwable $e) {
// 失敗
Log::critical($e->getMessage());
return ['status_code' => 400, 'error_messages' => ['登録に失敗しました。']];
}
// 仮登録に成功した場合
return ['status_code' => 200, 'params' => ['tel' => $r->tel]];
}
public function registerMain (Request $r) {
2021-11-05 12:50:00 +09:00
// ファイルサイズは10MiB以内
Validator::extend('image_size', function ($attribute, $value, $params, $validator) {
try {
2021-11-09 17:15:04 +09:00
if (is_null($value)) return true;
2021-11-10 12:42:11 +09:00
return strlen($value) < 1048576;
2021-11-05 12:50:00 +09:00
} catch (\Throwable $e) {
Log::critical($e->getMessage());
return false;
}
});
// ミームタイプ
Validator::extend('image_meme', function ($attribute, $value, $params, $validator) {
try {
2021-11-09 17:15:04 +09:00
if (is_null($value)) return true;
2021-11-05 12:50:00 +09:00
return (
mime_content_type($value) == 'image/jpeg' || // jpg
mime_content_type($value) == 'image/png' || // png
mime_content_type($value) == 'image/gif' // gif
);
} catch (\Throwable $e) {
Log::critical($e->getMessage());
return false;
}
});
2021-10-15 10:37:47 +09:00
$validate = Validator::make($r->all(), [
2021-10-29 17:51:41 +09:00
'identity' => 'required|max:20|alpha_num',
2021-10-15 10:37:47 +09:00
'email' => 'required|unique:children|max:255|email',
2021-11-05 12:50:00 +09:00
'password' => 'required|min:8|max:72',
2021-10-15 10:37:47 +09:00
'last_name' => 'required|max:100',
'first_name' => 'required|max:100',
2021-11-05 12:50:00 +09:00
'image' => 'image_size|image_meme',
2021-10-15 10:37:47 +09:00
'company' => 'max:100',
]);
2021-11-05 12:50:00 +09:00
2021-10-15 10:37:47 +09:00
if ($validate->fails()) {
// バリデーションエラー
return ['status_code' => 422, 'error_messages' => $validate->errors()];
}
2021-11-05 18:20:36 +09:00
// 有効期限が切れている場合
2021-11-09 19:14:43 +09:00
if (null === ($get = TelActivation::where('token', $r->token)->first())) {
return ['status_code' => 400, 'error_messages' => ['仮登録の有効期限が切れました。改めて親にお問い合わせいただき、再登録の手続きを行ってください。']];
}
if (time() > strtotime($get->ttl)) {
return ['status_code' => 400, 'error_messages' => ['仮登録の有効期限が切れました。改めて親にお問い合わせいただき、再登録の手続きを行ってください。']];
2021-11-05 18:20:36 +09:00
}
2021-10-29 17:51:41 +09:00
$password = Hash::make($r->password);
2021-11-10 11:34:43 +09:00
$ext = explode('/', mime_content_type($r->image))[1];
$filename = uniqid() . '.'.$ext;
$image = base64_decode(substr($r->image, strpos($r->image, ',') + 1));
Storage::disk('public')->put($filename, $image);
2021-10-15 10:37:47 +09:00
$insert = [
2021-10-29 17:51:41 +09:00
'identity' => $r->identity,
2021-10-15 10:37:47 +09:00
'email' => $r->email,
2021-11-05 18:20:36 +09:00
'tel' => $get->tel,
2021-10-15 10:37:47 +09:00
'password' => $password,
'last_name' => $r->last_name,
'first_name' => $r->first_name,
2021-11-10 11:34:43 +09:00
'image' => '/storage/'.$filename,
2021-10-15 10:37:47 +09:00
'company' => $r->company,
];
try {
2021-11-09 17:15:04 +09:00
$child = Child::create($insert);
TelActivation::where('token', $r->token)->update(['child_id' => $child->id]);
2021-10-15 10:37:47 +09:00
} catch (\Throwable $e) {
// 失敗
Log::critical($e->getMessage());
return ['status_code' => 400, 'error_messages' => ['登録に失敗しました。']];
}
// 本登録に成功
return ['status_code' => 200, 'success_messages' => ['本登録に成功しました。'], 'params' => ['tel' => $r->tel, 'password' => $password]];
}
2021-10-29 10:36:05 +09:00
public function requestPassword (Request $r) {
2021-11-10 11:42:07 +09:00
// 電話番号の文字数。
Validator::extend('tel_size', function ($attribute, $value, $params, $validator) {
try {
return strlen((string)$value) == 10 || strlen((string)$value) == 11;
} catch (\Throwable $e) {
Log::critical($e->getMessage());
return false;
}
});
2021-10-29 10:36:05 +09:00
$validate = Validator::make($r->all(), [
2021-11-10 11:42:07 +09:00
'tel' => 'required|numeric|starts_with:0|tel_size'
2021-10-29 10:36:05 +09:00
]);
if ($validate->fails()) {
// バリデーションエラー
return ['status_code' => 422, 'error_messages' => $validate->errors()];
}
2021-10-29 17:32:00 +09:00
if (null === ($result = Child::select('id')->where('tel', $r->tel)->first())) {
2021-10-29 10:36:05 +09:00
// メールアドレス照合に失敗
return ['status_code' => 400, 'error_messages' => ['電話番号が未登録です。入力した情報を確認してください。']];
}
2021-11-03 01:59:03 +09:00
$token = bin2hex(random_bytes(8));
2021-10-29 10:36:05 +09:00
$create = [
'type' => 1,
'child_id' => $result->id,
'tel' => $r->tel,
'token' => $token,
'ttl' => date('Y-m-d H:i:s', time()+28800)
];
try {
2021-11-10 15:45:09 +09:00
// DBに入る又は変えります。
TelActivation::where('child_id', $result->id)->delete();
2021-10-29 10:36:05 +09:00
TelActivation::create($create);
// SMSを送ります。
2021-11-05 18:20:36 +09:00
$message = 'パスワード再発行用URLです。
有効期限は8時間以内です。
https://kikikan.jp/c-account/forgot-password/reset/'.$token;
\Notification::route('nexmo', '81'.substr($r->tel, 1))->notify(new SmsNotification($message));
2021-10-29 10:36:05 +09:00
} catch (\Throwable $e) {
// 失敗
Log::critical($e->getMessage());
return ['status_code' => 400, 'error_messages' => '電話番号が未登録です。入力した情報を確認してください。'];
}
$params = [
'id' => $result->id,
'tel' => $r->tel,
];
// メールアドレス照合に成功
return ['status_code' => 200, 'params' => $params, 'success_messages' => ['再発行用パスワードの送信に成功しました。']];
}
2021-10-15 10:37:47 +09:00
public function search (Request $r) {
if (!isset($r->keyword)) {
return ['status_code' => 400, 'error_messages' => ['画像の更新に失敗しました。']];
}
if (null === ($result = Child::where('first_name', 'LIKE', '%'.$r->keyword.'%')->orWhere('last_name', 'LIKE', '%'.$r->keyword.'%')->orderBy('created_at', 'desc')->get())) {
// 親一覧の取得に失敗
return ['status_code' => 400];
}
// 親一覧の取得に成功
return ['status_code' => 200, 'params' => $result];
}
2021-10-06 14:50:13 +09:00
public function list () {
2021-10-07 13:51:53 +09:00
if (null === ($result = Child::orderBy('created_at', 'desc')->get())) {
// 親一覧の取得に失敗
return ['status_code' => 400];
2021-10-06 14:50:13 +09:00
}
2021-10-07 13:51:53 +09:00
// 親一覧の取得に成功
return ['status_code' => 200, 'params' => $result];
2021-10-06 14:50:13 +09:00
}
2021-10-30 19:02:09 +09:00
public function listOfFather ($father_id) {
if (!isset($father_id)) {
return ['status_code' => 400];
}
2021-10-06 14:50:13 +09:00
$result = [];
2021-10-30 19:02:09 +09:00
$child_select = ['first_name', 'last_name', 'tel'];
2021-10-06 14:50:13 +09:00
2021-10-30 19:02:09 +09:00
if (null === ($list = FatherRelation::select('child_id')->where('father_id', (int)$father_id)->orderBy('created_at', 'desc')->get())) {
2021-10-07 13:51:53 +09:00
return ['status_code' => 400];
}
2021-10-30 19:02:09 +09:00
foreach ($list as $i => $l) {
if (null === ($result[] = Child::select($child_select)->where('id', $l->child_id)->first())) {
$result[$i] = [];
2021-10-07 13:51:53 +09:00
}
2021-10-06 14:50:13 +09:00
}
2021-10-07 13:51:53 +09:00
return ['status_code' => 200, 'params' => $result];
}
2021-10-06 14:50:13 +09:00
public function listOfMeeting (Request $r) {
$result = [];
$child_select = ['id', 'image', 'last_name', 'first_name'];
2021-10-25 20:16:43 +09:00
if (null === ($list = MeetingApprovals::select('child_id')->where('meeting_id', (int)$r->meeting_id)->orderBy('created_at', 'desc')->get())) {
2021-10-07 13:51:53 +09:00
return ['status_code' => 400];
}
2021-10-07 13:51:53 +09:00
foreach ($list as $l) {
if (null === ($result[] = Child::select($child_select)->find($l->child_id))) {
return ['status_code' => 400];
}
2021-10-06 14:50:13 +09:00
}
2021-10-07 13:51:53 +09:00
return ['status_code' => 200, 'params' => $result];
}
2021-10-06 14:50:13 +09:00
public function listOfMeetingNotifyUnapprovel (Request $r) {
if (!isset($r->meeting_id)) {
return ['status_code' => 400, 'error_messages' => ['画像の更新に失敗しました。']];
}
$result = [];
$child_select = ['id', 'image', 'last_name', 'first_name', 'tel'];
$meeting_approvals_select = ['approval_at'];
2021-10-25 20:16:43 +09:00
if (null === ($list = MeetingApprovals::select($meeting_approvals_select)->where('meeting_id', (int)$r->meeting_id)->whereNull('approval_at')->get())) {
2021-10-07 13:51:53 +09:00
return ['status_code' => 400];
}
2021-10-06 14:50:13 +09:00
2021-10-07 13:51:53 +09:00
foreach ($list as $i => $l) {
if (null === ($result[] = Child::select($child_select)->where('id', $l->child_id)->get())) {
return ['status_code' => 400];
}
$result[$i]['meeting_approval'] = $l->approval_at;
2021-10-06 14:50:13 +09:00
}
2021-10-07 13:51:53 +09:00
return ['status_code' => 200, 'params' => $result];
}
2021-10-06 14:50:13 +09:00
public function listOfMeetingNotifyApprovel (Request $r) {
if (!isset($r->meeting_id)) {
return ['status_code' => 400, 'error_messages' => ['画像の更新に失敗しました。']];
}
2021-10-06 14:50:13 +09:00
$result = [];
$child_select = ['id', 'image', 'last_name', 'first_name', 'tel'];
$meeting_approvals_select = ['approval_at'];
2021-10-07 13:51:53 +09:00
if (null === ($list = MeetingApprovals::select($meeting_approvals_select)->where('meeting_id', $r->meeting_id)->whereNotNull('approval_at')->get())) {
return ['status_code' => 400];
}
2021-10-07 13:51:53 +09:00
foreach ($list as $i => $l) {
if (null === ($result[] = Child::select($child_select)->where('id', $l->child_id)->get())) {
return ['status_code' => 400];
}
$result[$i]['meeting_approval'] = $l->approval_at;
2021-10-06 14:50:13 +09:00
}
2021-10-07 13:51:53 +09:00
return ['status_code' => 200, 'params' => $result];
}
2021-10-06 14:50:13 +09:00
public function detail (Request $r, $child_id) {
2021-11-03 20:46:48 +09:00
if (!isset($child_id)) {
return ['status_code' => 400];
}
2021-10-29 17:58:06 +09:00
$child_select = ['email', 'tel', 'last_name', 'first_name', 'identity', 'image', 'company'];
2021-10-06 14:50:13 +09:00
// 親詳細の取得に成功
if (null === ($params = Child::select($child_select)->where('id', (int)$child_id)->first())) {
2021-10-07 13:51:53 +09:00
return ['status_code' => 400];
}
return ['status_code' => 200, 'params' => $params];
}
2021-11-10 10:30:16 +09:00
public function updateImage (Request $r, $child_id=null) {
if (isset($r->child_id)) {
$child_id = $r->child_id;
}
if (!isset($r->image) || !isset($child_id)) {
2021-10-15 10:37:47 +09:00
return ['status_code' => 400, 'error_messages' => ['画像の更新に失敗しました。']];
2021-10-06 14:50:13 +09:00
}
// ファイルサイズは10MiB以内
Validator::extend('image_size', function ($attribute, $value, $params, $validator) {
try {
return strlen(base64_decode($value)) < 1048576;
} catch (\Throwable $e) {
Log::critical($e->getMessage());
return false;
}
});
// ミームタイプ
Validator::extend('image_meme', function ($attribute, $value, $params, $validator) {
try {
return (
mime_content_type($value) == 'image/jpeg' || // jpg
mime_content_type($value) == 'image/png' || // png
mime_content_type($value) == 'image/gif' // gif
);
} catch (\Throwable $e) {
Log::critical($e->getMessage());
return false;
}
});
2021-10-06 14:50:13 +09:00
// バリデーションエラー
$validate = Validator::make($r->all(), ['image' => 'image_size|image_meme']);
2021-10-06 14:50:13 +09:00
if ($validate->fails()) {
return ['status_code' => 422, 'error_messages' => $validate->errors()];
}
2021-10-06 14:50:13 +09:00
try {
$ext = explode('/', mime_content_type($r->image))[1];
$filename = uniqid() . '.'.$ext;
$image = base64_decode(substr($r->image, strpos($r->image, ',') + 1));
Storage::disk('public')->put($filename, $image);
$update = [
2021-10-31 00:15:02 +09:00
'image' => '/storage/'.$filename,
];
2021-10-25 20:16:43 +09:00
Child::where('id', (int)$child_id)->update($update);
2021-10-06 14:50:13 +09:00
} catch (\Throwable $e) {
// 失敗
Log::critical($e->getMessage());
2021-10-15 10:37:47 +09:00
return ['status_code' => 400, 'error_messages' => ['画像の更新に失敗しました。']];
2021-10-06 14:50:13 +09:00
}
2021-10-06 14:50:13 +09:00
// 成功
2021-10-15 10:37:47 +09:00
return ['status_code' => 200, 'success_messages' => ['画像の更新に成功しました。']];
2021-10-06 14:50:13 +09:00
}
2021-11-10 10:30:16 +09:00
public function updateProfile (Request $r, $child_id=null) {
if (isset($r->child_id)) {
$child_id = $r->child_id;
}
2021-10-06 14:50:13 +09:00
if (!isset($child_id)) {
2021-10-15 10:37:47 +09:00
return ['status_code' => 400, 'error_messages' => ['子の更新に失敗しました。']];
2021-10-06 14:50:13 +09:00
}
2021-11-10 11:42:07 +09:00
// 電話番号の文字数。
Validator::extend('tel_size', function ($attribute, $value, $params, $validator) {
try {
return strlen((string)$value) == 10 || strlen((string)$value) == 11;
} catch (\Throwable $e) {
Log::critical($e->getMessage());
return false;
}
});
2021-10-06 14:50:13 +09:00
// バリデーションエラー
$validate = Validator::make($r->all(), [
2021-10-25 20:16:43 +09:00
'email' => 'required|max:255|email',
2021-11-10 11:42:07 +09:00
'tel' => 'required|numeric|starts_with:0|tel_size',
2021-10-06 14:50:13 +09:00
'last_name' => 'required|max:100',
'first_name' => 'required|max:100',
2021-10-29 17:58:06 +09:00
'identity' => 'required|max:20|alpha_num',
2021-10-06 14:50:13 +09:00
'company' => 'max:100',
]);
2021-10-06 14:50:13 +09:00
if ($validate->fails()) {
return ['status_code' => 422, 'error_messages' => $validate->errors()];
}
2021-10-25 20:16:43 +09:00
$update = [
'email' => $r->email,
'tel' => $r->tel,
'last_name' => $r->last_name,
'first_name' => $r->first_name,
2021-10-29 17:58:06 +09:00
'identity' => $r->identity,
2021-10-25 20:16:43 +09:00
'company' => $r->company,
];
2021-10-06 14:50:13 +09:00
try {
2021-10-25 20:16:43 +09:00
Child::where('id', (int)$child_id)->update($update);
2021-10-06 14:50:13 +09:00
} catch (\Throwable $e) {
// 失敗
Log::critical($e->getMessage());
2021-10-15 10:37:47 +09:00
return ['status_code' => 400, 'error_messages' => ['子の更新に失敗しました。']];
}
2021-10-06 14:50:13 +09:00
// 成功
2021-10-15 10:37:47 +09:00
return ['status_code' => 200, 'success_messages' => ['子の更新に成功しました。']];
}
2021-11-10 13:53:01 +09:00
public function updatePassword (Request $r, $child_id=null) {
2021-11-10 14:59:40 +09:00
if (isset($r->child_id)) {
$child_id = $r->child_id;
}
2021-11-10 13:53:01 +09:00
if (is_null($child_id) && !isset($r->token)) {
2021-11-10 14:59:40 +09:00
return ['status_code' => 400, 'error_messages' => ['パスワードの更新に失敗しました。']];
2021-11-10 10:30:16 +09:00
}
2021-11-10 15:45:09 +09:00
if (isset($r->token)) {
2021-11-10 16:41:29 +09:00
if (null === ($ta = TelActivation::select('child_id')->where('token', $r->token)->first())) {
2021-11-10 15:45:09 +09:00
return ['status_code' => 400, 'error_messages' => ['パスワードの更新に失敗しました。']];
}
2021-11-10 16:41:29 +09:00
$child_id = $ta->child_id;
2021-11-10 15:45:09 +09:00
}
2021-10-06 14:50:13 +09:00
// バリデーションエラー
$validate = Validator::make($r->all(), [
'password' => 'required|min:8|max:72|confirmed',
]);
2021-10-06 14:50:13 +09:00
if ($validate->fails()) {
return ['status_code' => 422, 'error_messages' => $validate->errors()];
}
2021-10-25 20:16:43 +09:00
$update = [
'password' => Hash::make($r->password),
];
2021-10-06 14:50:13 +09:00
try {
2021-10-25 20:16:43 +09:00
Child::where('id', (int)$child_id)->update($update);
2021-10-06 14:50:13 +09:00
} catch (\Throwable $e) {
// 失敗
Log::critical($e->getMessage());
return ['status_code' => 400, 'error_messages' => ['パスワードの更新に失敗しました。']];
}
// 成功
return ['status_code' => 200, 'success_messages' => ['パスワードの更新に成功しました。']];
}
public function withdrawal (Request $r) {
2021-10-06 14:50:13 +09:00
// 削除成功
2021-10-07 13:51:53 +09:00
try {
Child::where('id', (int)$r->child_id)->delete();
Session::forget($this->getGuard());
2021-10-07 13:51:53 +09:00
} catch (\Throwable $e) {
Log::critical($e->getMessage());
return ['status_code' => 400];
2021-10-06 14:50:13 +09:00
}
2021-10-06 14:50:13 +09:00
// 削除失敗
2021-10-05 00:35:47 +09:00
return ['status_code' => 200];
}
}