Merge branch 'newbackend' of https://github.com/nakazawakan/kikikanri into fe_fix_new

このコミットが含まれているのは:
dragon1211 2022-02-01 12:05:37 -08:00
コミット 40e6a46865
21個のファイルの変更2108行の追加2046行の削除

ファイルの表示

@ -1,4 +1,4 @@
APP_NAME=KIKI APP_NAME=KIKIシステム
APP_ENV=local APP_ENV=local
APP_KEY= APP_KEY=
APP_DEBUG=true APP_DEBUG=true

ファイルの表示

@ -1,4 +1,4 @@
APP_NAME=KIKI APP_NAME=KIKIシステム
APP_ENV=production APP_ENV=production
APP_KEY= APP_KEY=
APP_DEBUG=false APP_DEBUG=false

ファイルの表示

@ -5,6 +5,9 @@ namespace App\Console;
use Illuminate\Console\Scheduling\Schedule; use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel; use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use App\Models\TelActivation;
use App\Models\EmailActivation;
class Kernel extends ConsoleKernel class Kernel extends ConsoleKernel
{ {
/** /**
@ -24,6 +27,18 @@ class Kernel extends ConsoleKernel
*/ */
protected function schedule(Schedule $schedule) protected function schedule(Schedule $schedule)
{ {
$schedule->call(function () {
foreach (TelActivation::get() as $t) {
if (time() > strtotime($t->ttl)) {
TelActivation::where('id', $t->id)->delete();
}
}
foreach (EmailActivation::get() as $e) {
if (time() > strtotime($e->ttl)) {
EmailActivation::where('id', $e->id)->delete();
}
}
})->everyMinute();
// $schedule->command('inspire')->hourly(); // $schedule->command('inspire')->hourly();
} }

ファイルの表示

@ -111,12 +111,15 @@ trait AuthenticationTrait {
//unset($_COOKIE['remember_token']); //unset($_COOKIE['remember_token']);
//setcookie('remember_token', '', time() - 3600, '/', $_SERVER['HTTP_HOST'], 0, 1); //setcookie('remember_token', '', time() - 3600, '/', $_SERVER['HTTP_HOST'], 0, 1);
$expire = (int)time() + ((int)env('SESSION_LIFETIME') * 60);
if ($r->remember_token == 'true') { if ($r->remember_token == 'true') {
$token = bin2hex(random_bytes(24)); $token = bin2hex(random_bytes(24));
try { try {
$this->getModel()->where('id', $get->id)->update(['remember_token' => $token]); $this->getModel()->where('id', $get->id)->update(['remember_token' => $token]);
setcookie('remember_token', $token, time()+157788000, '/', $_SERVER['HTTP_HOST'], false, true); $expire = (int)time()+157788000;
setcookie('remember_token', $token, $expire, '/', $_SERVER['HTTP_HOST'], false, true);
} }
catch (\Throwable $e) { catch (\Throwable $e) {
Log::critical($e->getMessage()); Log::critical($e->getMessage());
@ -127,7 +130,7 @@ trait AuthenticationTrait {
// セッションを想像する // セッションを想像する
$login_user_datum = $this->makeSession($this->getGuard(), $get->toArray()); $login_user_datum = $this->makeSession($this->getGuard(), $get->toArray());
return ['status_code' => 200, 'params' => ['id' => $login_user_datum['id'], 'expire' => (int)time() + ((int)env('SESSION_LIFETIME') * 60)]]; return ['status_code' => 200, 'params' => ['id' => $login_user_datum['id'], 'expire' => $expire]];
} }
public function logout () { public function logout () {

ファイルの表示

@ -585,7 +585,12 @@ class ChildrenController extends Controller {
if (isset($r->child_id)) { if (isset($r->child_id)) {
$child_id = $r->child_id; $child_id = $r->child_id;
} }
$child_id = request()->route()->action['as'] == 'cpa' ? (int)$child_id : (int)session()->get('children')['id']; else if (isset($r->token)) {
$child_id = TelActivation::select('id')->where('token', $r->token)->first()->id;
}
else if (null !== session()->get('children')['id']) {
$child_id = (int)session()->get('children')['id'];
}
if (is_null($child_id) && !isset($r->token)) { if (is_null($child_id) && !isset($r->token)) {
return ['status_code' => 400, 'error_messages' => ['パスワードの更新に失敗しました。']]; return ['status_code' => 400, 'error_messages' => ['パスワードの更新に失敗しました。']];

ファイルの表示

@ -21,67 +21,80 @@ class FilesController extends Controller {
abort_if(!Storage::disk('private')->exists($path), 404, $err); abort_if(!Storage::disk('private')->exists($path), 404, $err);
abort_if(!session()->has('children') && !session()->has('fathers') && !session()->has('admins'), 404, $err); abort_if(!session()->has('children') && !session()->has('fathers') && !session()->has('admins'), 404, $err);
if (substr($path, -4) == '.pdf') { // 管理者は全部見えます。
if (session()->has('children')) { if (session()->has('admins')) {
if (null !== ($rel = FatherRelation::where('child_id', (int)session()->get('children')['id'])->first())) { $got = true;
$got = true;
}
if (null !== (Meeting::where('father_id', $rel->father_id)->where('pdf', '/files/'.$path)->first())) {
$got = true;
}
abort_if(!$got, 404, $err);
}
else if (session()->has('fathers')) {
if (null !== (Meeting::where('father_id', (int)session()->get('fathers')['id'])->where('pdf', '/files/'.$path)->first())) {
$got = true;
}
abort_if(!$got, 404, $err);
}
} }
else {
if (null !== ($meetimg = MeetingImage::where('image', '/files/'.$path)->first())) { // 既にgotはtrueの場合、スキップ。このチェックが無いと、trueになったらも全部確認する様になります。
if (!$got) {
// PDFの場合
if (substr($path, -4) == '.pdf') {
// 子供
if (session()->has('children')) { if (session()->has('children')) {
// ミーティング
if (null !== ($rel = FatherRelation::where('child_id', (int)session()->get('children')['id'])->first())) { if (null !== ($rel = FatherRelation::where('child_id', (int)session()->get('children')['id'])->first())) {
$got = true; if (null !== (Meeting::where('father_id', $rel->father_id)->where('pdf', '/files/'.$path)->first())) {
$got = true;
}
} }
if (null !== (Meeting::where('id', $meetimg->meeting_id)->where('father_id', $rel->father_id)->first())) {
$got = true;
}
abort_if(!$got, 404, $err);
} }
if (session()->has('fathers')) { // 親
if (null !== (Meeting::where('id', $meetimg->meeting_id)->where('father_id', (int)session()->get('fathers')['id'])->first())) { if (!$got && session()->has('fathers')) {
// ミーティング
if (null !== (Meeting::where('father_id', (int)session()->get('fathers')['id'])->where('pdf', '/files/'.$path)->first())) {
$got = true; $got = true;
} }
abort_if(!$got, 404, $err);
} }
abort_if(!$got, 404, $err);
} }
// 画像の場合
else { else {
if (session()->has('children')) { // ミーティング
if (null !== (Child::where('id', (int)session()->get('children')['id'])->where('image', '/files/'.$path)->first())) { if (null !== ($meetimg = MeetingImage::where('image', '/files/'.$path)->first())) {
$got = true; // 子供
if (session()->has('children')) {
if (null !== ($rel = FatherRelation::where('child_id', (int)session()->get('children')['id'])->first())) {
if (null !== (Meeting::where('id', $meetimg->meeting_id)->where('father_id', $rel->father_id)->first())) {
$got = true;
}
}
} }
foreach (FatherRelation::select('father_id')->where('child_id', (int)session()->get('children')['id'])->get() as $rel) { // 親
if (null !== (Father::where('id', (int)$rel->father_id)->where('image', '/files/'.$path)->first())) { if (!$got && session()->has('fathers')) {
if (null !== (Meeting::where('id', $meetimg->meeting_id)->where('father_id', (int)session()->get('fathers')['id'])->first())) {
$got = true; $got = true;
} }
} }
abort_if(!$got, 404, $err);
} }
if (session()->has('fathers')) { else {
if (null !== (Father::where('id', (int)session()->get('fathers')['id'])->where('image', '/files/'.$path)->first())) { if (session()->has('children')) {
$got = true; if (null !== (Child::where('id', (int)session()->get('children')['id'])->where('image', '/files/'.$path)->first())) {
}
foreach (FatherRelation::select('child_id')->where('father_id', (int)session()->get('fathers')['id'])->get() as $rel) {
if (null !== (Child::where('id', (int)$rel->child_id)->where('image', '/files/'.$path)->first())) {
$got = true; $got = true;
} }
foreach (FatherRelation::select('father_id')->where('child_id', (int)session()->get('children')['id'])->get() as $rel) {
if (null !== (Father::where('id', (int)$rel->father_id)->where('image', '/files/'.$path)->first())) {
$got = true;
}
}
}
if (session()->has('fathers')) {
if (null !== (Father::where('id', (int)session()->get('fathers')['id'])->where('image', '/files/'.$path)->first())) {
$got = true;
}
foreach (FatherRelation::select('child_id')->where('father_id', (int)session()->get('fathers')['id'])->get() as $rel) {
if (null !== (Child::where('id', (int)$rel->child_id)->where('image', '/files/'.$path)->first())) {
$got = true;
}
}
} }
abort_if(!$got, 404, $err);
} }
abort_if(!$got, 404, $err);
} }
} }
return Storage::disk('private')->response($path); return Storage::disk('private')->response($path);
} }
} }

ファイルの表示

@ -93,11 +93,11 @@ class MeetingsController extends Controller {
if (substr($r->pdf, -4) != '.pdf') { if (substr($r->pdf, -4) != '.pdf') {
$pdf = base64_decode(substr($r->pdf, strpos($r->pdf, ',') + 1)); $pdf = base64_decode(substr($r->pdf, strpos($r->pdf, ',') + 1));
Storage::disk('private')->put($filename, $pdf); Storage::disk('private')->put($filename, $pdf);
} }
else { else {
$insert['pdf'] = $r->pdf; $pdf = Storage::disk('private')->get(substr($r->pdf, 7));
Storage::disk('private')->put($filename, $pdf);
} }
} }
@ -106,22 +106,22 @@ class MeetingsController extends Controller {
if (isset($r->image)) { if (isset($r->image)) {
foreach ($r->image as $img) { foreach ($r->image as $img) {
if (substr($img, -5) != '.jpeg' && substr($img, -4) != '.jpg' && substr($img, -4) != '.png' && substr($img, -4) != '.gif') { $fname = $this->uuidv4() . '.jpg';
$fname = $this->uuidv4() . '.jpg'; $fnames[] = $fname;
$fnames[] = $fname;
$image = base64_decode(substr($img, strpos($img, ',') + 1));
Storage::disk('private')->put($fname, $image);
$this->fiximg($fname);
$imgname = '/files/'.$fname; if (substr($img, -5) != '.jpeg' && substr($img, -4) != '.jpg' && substr($img, -4) != '.png' && substr($img, -4) != '.gif') {
$image = base64_decode(substr($img, strpos($img, ',') + 1));
} }
else { else {
$imgname = $img; $image = Storage::disk('private')->get(substr($img, 7));
} }
Storage::disk('private')->put($fname, $image);
$this->fiximg($fname);
$insert_image = [ $insert_image = [
'meeting_id' => (int)$meeting, 'meeting_id' => (int)$meeting,
'image' => $imgname, 'image' => '/files/'.$fname,
]; ];
MeetingImage::create($insert_image); MeetingImage::create($insert_image);

ファイルの表示

@ -11,7 +11,7 @@ class ChildrenMainRegistrationMail extends Mailable {
use Queueable, SerializesModels; use Queueable, SerializesModels;
public function build () { public function build () {
return $this->subject('【KIKIシステム】本登録が完了しました。')->text('emails.children.registration.main', [ return $this->subject('【KIKI】本登録が完了しました。')->text('emails.children.registration.main', [
'url' => '/c-account/login', 'url' => '/c-account/login',
]); ]);
} }

ファイルの表示

@ -16,7 +16,7 @@ class ContactsMail extends Mailable {
} }
public function build () { public function build () {
return $this->subject('【KIKIシステム】お問い合わせありがとうございます。')->text('emails.contacts', [ return $this->subject('【KIKI】お問い合わせありがとうございます。')->text('emails.contacts', [
'messages' => $this->message 'messages' => $this->message
]); ]);
} }

ファイルの表示

@ -18,7 +18,7 @@ class FathersApprovalAgainMail extends Mailable {
} }
public function build () { public function build () {
return $this->subject('【KIKIシステム】KIKI運営事務局からのお知らせ')->text('emails.fathers.approvalagain', [ return $this->subject('【KIKI】KIKI運営事務局からのお知らせ')->text('emails.fathers.approvalagain', [
'father' => $this->father, 'father' => $this->father,
'url' => '/c-account/meeting/detail/'.$this->meeting_id, 'url' => '/c-account/meeting/detail/'.$this->meeting_id,
]); ]);

ファイルの表示

@ -18,7 +18,7 @@ class FathersApprovalMail extends Mailable {
} }
public function build () { public function build () {
return $this->subject('【KIKIシステム】KIKI運営事務局からのお知らせ')->text('emails.fathers.approval', [ return $this->subject('【KIKI】KIKI運営事務局からのお知らせ')->text('emails.fathers.approval', [
'father' => $this->father, 'father' => $this->father,
'url' => '/c-account/meeting/detail/'.$this->meeting_id, 'url' => '/c-account/meeting/detail/'.$this->meeting_id,
]); ]);

ファイルの表示

@ -16,7 +16,7 @@ class FathersForgetPasswordMail extends Mailable {
} }
public function build () { public function build () {
return $this->subject('【KIKIシステム】パスワードリセットを依頼しました。')->text('emails.fathers.forgotpassword', [ return $this->subject('【KIKI】パスワードリセットを依頼しました。')->text('emails.fathers.forgotpassword', [
'url' => '/p-account/forgot-password/reset/'.$this->token, 'url' => '/p-account/forgot-password/reset/'.$this->token,
]); ]);
} }

ファイルの表示

@ -11,7 +11,7 @@ class FathersRegistrationMainMail extends Mailable {
use Queueable, SerializesModels; use Queueable, SerializesModels;
public function build () { public function build () {
return $this->subject('【KIKIシステム】本登録が完了しました。')->text('emails.fathers.registration.main', [ return $this->subject('【KIKI】本登録が完了しました。')->text('emails.fathers.registration.main', [
'url' => '/p-account/login', 'url' => '/p-account/login',
]); ]);
} }

ファイルの表示

@ -16,7 +16,7 @@ class FathersRegistrationTemporaryMail extends Mailable {
} }
public function build () { public function build () {
return $this->subject('【KIKIシステム】会員登録のご案内')->text('emails.fathers.registration.temporary', [ return $this->subject('【KIKI】会員登録のご案内')->text('emails.fathers.registration.temporary', [
'url' => '/p-account/register/'.$this->token, 'url' => '/p-account/register/'.$this->token,
]); ]);
} }

ファイルの表示

@ -18,7 +18,7 @@ class MeetingEditAwareness extends Mailable {
} }
public function build () { public function build () {
return $this->subject('【KIKIシステム】KIKI運営事務局からのお知らせ')->text('emails.fathers.meetingawareness', [ return $this->subject('【KIKI】KIKI運営事務局からのお知らせ')->text('emails.fathers.meetingawareness', [
'child' => $this->child, 'child' => $this->child,
'url' => '/p-account/meeting/detail/'.$this->meeting_id, 'url' => '/p-account/meeting/detail/'.$this->meeting_id,
]); ]);

ファイルの表示

@ -18,7 +18,7 @@ class MeetingEditNotification extends Mailable {
} }
public function build () { public function build () {
return $this->subject('【KIKIシステム】KIKI運営事務局からのお知らせ')->text('emails.fathers.meetingedit', [ return $this->subject('【KIKI】KIKI運営事務局からのお知らせ')->text('emails.fathers.meetingedit', [
'father' => $this->father, 'father' => $this->father,
'url' => '/c-account/meeting/detail/'.$this->meeting_id, 'url' => '/c-account/meeting/detail/'.$this->meeting_id,
]); ]);

ファイルの表示

@ -12897,7 +12897,7 @@ categories: [project]
@font-face { @font-face {
font-family: "iconfont"; font-family: "iconfont";
src: url(/fonts/iconfont.eot?9bd2f8e21fb68f3cb69f306c7a5a07d2); src: url(/fonts/iconfont.eot?9bd2f8e21fb68f3cb69f306c7a5a07d2);
src: url(/fonts/iconfont.eot?9bd2f8e21fb68f3cb69f306c7a5a07d2) format("eot"), url(/fonts/iconfont.woff?72290a51f520574be856b3621acc29a1) format("woff"), url(/fonts/iconfont.ttf?e240ce427caf7549e576c77b39a1d3f1) format("truetype"), url(/fonts/iconfont.svg?9e48c54f8bbb472c1c286234fdd6636f) format("svg"); src: url(/fonts/iconfont.eot?9bd2f8e21fb68f3cb69f306c7a5a07d2) format("eot"), url(/fonts/iconfont.woff?72290a51f520574be856b3621acc29a1) format("woff"), url(/fonts/iconfont.ttf?e240ce427caf7549e576c77b39a1d3f1) format("truetype"), url(/fonts/iconfont.svg?d812f238f7ec32f5cb5ebd322f320a02) format("svg");
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
} }

ファイル差分が大きすぎるため省略します 差分を読み込み

ファイルの表示

@ -168,7 +168,6 @@ Route::group(['prefix' => 'children'], function () {
Route::group(['prefix' => 'father'], function () { Route::group(['prefix' => 'father'], function () {
Route::group(['prefix' => 'relations'], function () { Route::group(['prefix' => 'relations'], function () {
Route::get('/checkNull', '\App\Http\Controllers\Api\FatherRelationsController@checkNull')->name('chknull_child'); Route::get('/checkNull', '\App\Http\Controllers\Api\FatherRelationsController@checkNull')->name('chknull_child');
Route::get('/check', '\App\Http\Controllers\Api\FatherRelationsController@check')->name('chk_child');
}); });
}); });

ファイルの表示

@ -13,7 +13,7 @@ RUN apt-get install -y nodejs
# yarnをインストール # yarnをインストール
RUN apt-get update RUN apt-get update
RUN apt-get -y install git unzip libzip-dev libicu-dev libonig-dev zlib1g-dev RUN apt-get -y install git unzip libzip-dev libicu-dev libonig-dev zlib1g-dev cron
RUN apt-get clean RUN apt-get clean
RUN curl --output libpng16-16_1.6.36-6_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libp/libpng1.6/libpng16-16_1.6.36-6_amd64.deb RUN curl --output libpng16-16_1.6.36-6_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libp/libpng1.6/libpng16-16_1.6.36-6_amd64.deb
RUN curl --output libpng-dev_1.6.36-6_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libp/libpng1.6/libpng-dev_1.6.36-6_amd64.deb RUN curl --output libpng-dev_1.6.36-6_amd64.deb http://ftp.jp.debian.org/debian/pool/main/libp/libpng1.6/libpng-dev_1.6.36-6_amd64.deb
@ -31,5 +31,9 @@ RUN docker-php-ext-configure gd --with-jpeg
RUN docker-php-ext-install -j$(nproc) intl pdo_mysql zip bcmath gd exif RUN docker-php-ext-install -j$(nproc) intl pdo_mysql zip bcmath gd exif
COPY ./php.ini /usr/local/etc/php/php.ini COPY ./php.ini /usr/local/etc/php/php.ini
COPY ./crontab /etc/crontab
CMD ["cron","-f", "-l", "2"]
#RUN cd /work && composer update && npm run prod && php artisan migrate:fresh --seed
WORKDIR /work WORKDIR /work

23
infra/php/crontab ノーマルファイル
ファイルの表示

@ -0,0 +1,23 @@
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
* * * * * root cd /work && php artisan schedule:run >> /dev/null 2>&1
#