$request->input('date', date('Y/m/d')), 'time' => $request->input('time', date('H:i')), 'link' => $request->input('link', ''), 'tags' => $request->input('tags', ''), 'note' => $request->input('note', ''), 'is_private' => $request->input('is_private', 0) == 1 ]; return view('ejaculation.checkin')->with('defaults', $defaults); } public function store(Request $request) { $inputs = $request->all(); if ($request->has('note')) { $inputs['note'] = str_replace(["\r\n", "\r"], "\n", $inputs['note']); } $validator = Validator::make($inputs, [ 'date' => 'required|date_format:Y/m/d', 'time' => 'required|date_format:H:i', 'note' => 'nullable|string|max:500', 'link' => 'nullable|url|max:2000', 'tags' => 'nullable|string', ])->after(function ($validator) use ($request, $inputs) { // 日時の重複チェック if (!$validator->errors()->hasAny(['date', 'time'])) { $dt = $inputs['date'] . ' ' . $inputs['time']; if (Ejaculation::where(['user_id' => Auth::id(), 'ejaculated_date' => $dt])->count()) { $validator->errors()->add('datetime', '既にこの日時にチェックインしているため、登録できません。'); } } }); if ($validator->fails()) { return redirect()->route('checkin')->withErrors($validator)->withInput(); } $ejaculation = Ejaculation::create([ 'user_id' => Auth::id(), 'ejaculated_date' => Carbon::createFromFormat('Y/m/d H:i', $inputs['date'] . ' ' . $inputs['time']), 'note' => $inputs['note'] ?? '', 'link' => $inputs['link'] ?? '', 'is_private' => $request->has('is_private') ?? false ]); $tagIds = []; if (!empty($inputs['tags'])) { $tags = explode(' ', $inputs['tags']); foreach ($tags as $tag) { $tag = Tag::firstOrCreate(['name' => $tag]); $tagIds[] = $tag->id; } } $ejaculation->tags()->sync($tagIds); if (!empty($ejaculation->link)) { event(new LinkDiscovered($ejaculation->link)); } return redirect()->route('checkin.show', ['id' => $ejaculation->id])->with('status', 'チェックインしました!'); } public function show($id) { $ejaculation = Ejaculation::findOrFail($id); $user = User::findOrFail($ejaculation->user_id); // 1つ前のチェックインからの経過時間を求める $previousEjaculation = Ejaculation::select('ejaculated_date') ->where('user_id', $ejaculation->user_id) ->where('ejaculated_date', '<', $ejaculation->ejaculated_date) ->orderByDesc('ejaculated_date') ->first(); if (!empty($previousEjaculation)) { $ejaculatedSpan = $ejaculation->ejaculated_date ->diff($previousEjaculation->ejaculated_date) ->format('%a日 %h時間 %i分'); } else { $ejaculatedSpan = null; } return view('ejaculation.show')->with(compact('user', 'ejaculation', 'ejaculatedSpan')); } public function edit($id) { $ejaculation = Ejaculation::findOrFail($id); return view('ejaculation.edit')->with(compact('ejaculation')); } public function update(Request $request, $id) { $ejaculation = Ejaculation::findOrFail($id); $inputs = $request->all(); if ($request->has('note')) { $inputs['note'] = str_replace(["\r\n", "\r"], "\n", $inputs['note']); } $validator = Validator::make($inputs, [ 'date' => 'required|date_format:Y/m/d', 'time' => 'required|date_format:H:i', 'note' => 'nullable|string|max:500', 'link' => 'nullable|url|max:2000', 'tags' => 'nullable|string', ])->after(function ($validator) use ($id, $request, $inputs) { // 日時の重複チェック if (!$validator->errors()->hasAny(['date', 'time'])) { $dt = $inputs['date'] . ' ' . $inputs['time']; if (Ejaculation::where(['user_id' => Auth::id(), 'ejaculated_date' => $dt])->where('id', '<>', $id)->count()) { $validator->errors()->add('datetime', '既にこの日時にチェックインしているため、登録できません。'); } } }); if ($validator->fails()) { return redirect()->route('checkin.edit', ['id' => $id])->withErrors($validator)->withInput(); } $ejaculation->fill([ 'ejaculated_date' => Carbon::createFromFormat('Y/m/d H:i', $inputs['date'] . ' ' . $inputs['time']), 'note' => $inputs['note'] ?? '', 'link' => $inputs['link'] ?? '', 'is_private' => $request->has('is_private') ?? false ])->save(); $tagIds = []; if (!empty($inputs['tags'])) { $tags = explode(' ', $inputs['tags']); foreach ($tags as $tag) { $tag = Tag::firstOrCreate(['name' => $tag]); $tagIds[] = $tag->id; } } $ejaculation->tags()->sync($tagIds); if (!empty($ejaculation->link)) { event(new LinkDiscovered($ejaculation->link)); } return redirect()->route('checkin.show', ['id' => $ejaculation->id])->with('status', 'チェックインを修正しました!'); } public function destroy($id) { $ejaculation = Ejaculation::findOrFail($id); $user = User::findOrFail($ejaculation->user_id); $ejaculation->tags()->detach(); $ejaculation->delete(); return redirect()->route('user.profile', ['name' => $user->name])->with('status', '削除しました。'); } }