app/Http/Controllers/JournalController.php (144 lines of code) (raw):

<?php namespace App\Http\Controllers; use App\Helpers\DateHelper; use App\Models\Journal\Day; use Illuminate\Http\Request; use App\Models\Journal\Entry; use App\Helpers\JournalHelper; use App\Models\Journal\JournalEntry; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use App\Http\Requests\Journal\DaysRequest; class JournalController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory */ public function index() { return view('journal.index'); } /** * Get all the journal entries. * @return array */ public function list() { $entries = collect([]); $journalEntries = auth()->user()->account->journalEntries()->paginate(30); // this is needed to determine if we need to display the calendar // (month + year) next to the journal entry $previousEntryMonth = 0; $previousEntryYear = 0; $showCalendar = true; foreach ($journalEntries->items() as $journalEntry) { if ($previousEntryMonth == $journalEntry->date->month && $previousEntryYear == $journalEntry->date->year) { $showCalendar = false; } $data = [ 'id' => $journalEntry->id, 'date' => $journalEntry->date, 'journalable_id' => $journalEntry->journalable_id, 'journalable_type' => $journalEntry->journalable_type, 'object' => $journalEntry->getObjectData(), 'show_calendar' => $showCalendar, ]; $entries->push($data); $previousEntryMonth = $journalEntry->date->month; $previousEntryYear = $journalEntry->date->year; $showCalendar = true; } // I need the pagination items when I send back the array. // There is probably a simpler way to achieve this. return [ 'total' => $journalEntries->total(), 'per_page' => $journalEntries->perPage(), 'current_page' => $journalEntries->currentPage(), 'next_page_url' => $journalEntries->nextPageUrl(), 'prev_page_url' => $journalEntries->previousPageUrl(), 'data' => $entries, ]; } /** * Gets the details of a single Journal Entry. * @param JournalEntry $journalEntry * @return array */ public function get(JournalEntry $journalEntry) { return $journalEntry->getObjectData(); } /** * Store the day entry. */ public function storeDay(DaysRequest $request) { $day = auth()->user()->account->days()->create([ 'date' => now(DateHelper::getTimezone()), 'rate' => $request->input('rate'), 'comment' => $request->input('comment'), ]); // Log a journal entry $journalEntry = JournalEntry::add($day); return [ 'id' => $journalEntry->id, 'date' => $journalEntry->date, 'journalable_id' => $journalEntry->journalable_id, 'journalable_type' => $journalEntry->journalable_type, 'object' => $journalEntry->getObjectData(), 'show_calendar' => true, ]; } /** * Delete the Day entry. * * @return void */ public function trashDay(Day $day): void { $day->deleteJournalEntry(); $day->delete(); } /** * Indicates whether the user has already rated the current day. * @return string */ public function hasRated() { if (JournalHelper::hasAlreadyRatedToday(auth()->user())) { return 'true'; } return 'notYet'; } /** * Display the Create journal entry screen. * * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory */ public function create() { return view('journal.add'); } /** * Saves the journal entry. * * @param Request $request * @return \Illuminate\Http\RedirectResponse */ public function save(Request $request) { $validator = Validator::make($request->all(), [ 'entry' => 'required|string', 'date' => 'required|date', ]); if ($validator->fails()) { return back() ->withInput() ->withErrors($validator); } $entry = new Entry; $entry->account_id = $request->user()->account_id; $entry->post = $request->input('entry'); if ($request->input('title') != '') { $entry->title = $request->input('title'); } $entry->save(); $entry->date = $request->input('date'); // Log a journal entry JournalEntry::add($entry); return redirect()->route('journal.index'); } /** * Display the Edit journal entry screen. * * @param Entry $entry * @return \Illuminate\View\View */ public function edit(Entry $entry) { return view('journal.edit') ->withEntry($entry); } /** * Update a journal entry. * * @param Request $request * @return \Illuminate\Http\RedirectResponse */ public function update(Request $request, Entry $entry) { $validator = Validator::make($request->all(), [ 'entry' => 'required|string', 'date' => 'required|date', ]); if ($validator->fails()) { return back() ->withInput() ->withErrors($validator); } $entry->post = $request->input('entry'); if ($request->input('title') != '') { $entry->title = $request->input('title'); } $entry->save(); // Update journal entry $journalEntry = $entry->journalEntry; if ($journalEntry) { $entry->date = $request->input('date'); $journalEntry->edit($entry); } return redirect()->route('journal.index'); } /** * Delete the reminder. */ public function deleteEntry(Request $request, Entry $entry) { $entry->deleteJournalEntry(); $entry->delete(); return ['true']; } }