Skip to content

Commit

Permalink
feat: notes module (monicahq/chandler#29)
Browse files Browse the repository at this point in the history
  • Loading branch information
djaiss authored Jan 22, 2022
1 parent eb8a0ea commit a30ec99
Show file tree
Hide file tree
Showing 50 changed files with 795 additions and 184 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?php

namespace App\Http\Controllers\Vault\Contact\Modules;

use App\Models\Contact;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use App\Services\Contact\ManageNote\CreateNote;
use App\Services\Contact\ManageNote\UpdateNote;
use App\Services\Contact\ManageNote\DestroyNote;
use App\Http\Controllers\Vault\Contact\Modules\ViewHelpers\ModuleNotesViewHelper;

class ContactNoteController extends Controller
{
public function store(Request $request, int $vaultId, int $contactId)
{
$data = [
'account_id' => Auth::user()->account_id,
'author_id' => Auth::user()->id,
'vault_id' => $vaultId,
'contact_id' => $contactId,
'title' => $request->input('title'),
'body' => $request->input('body'),
];

$note = (new CreateNote)->execute($data);

$contact = Contact::find($contactId);

return response()->json([
'data' => ModuleNotesViewHelper::dto($contact, $note),
], 201);
}

public function update(Request $request, int $vaultId, int $contactId, int $noteId)
{
$data = [
'account_id' => Auth::user()->account_id,
'author_id' => Auth::user()->id,
'vault_id' => $vaultId,
'contact_id' => $contactId,
'note_id' => $noteId,
'title' => $request->input('title'),
'body' => $request->input('body'),
];

$note = (new UpdateNote)->execute($data);

$contact = Contact::find($contactId);

return response()->json([
'data' => ModuleNotesViewHelper::dto($contact, $note),
], 200);
}

public function destroy(Request $request, int $vaultId, int $contactId, int $noteId)
{
$data = [
'account_id' => Auth::user()->account_id,
'author_id' => Auth::user()->id,
'vault_id' => $vaultId,
'contact_id' => $contactId,
'note_id' => $noteId,
];

(new DestroyNote)->execute($data);

return response()->json([
'data' => true,
], 200);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php

namespace App\Http\Controllers\Vault\Contact\Modules\ViewHelpers;

use App\Models\Note;
use App\Models\Contact;
use App\Helpers\DateHelper;

class ModuleNotesViewHelper
{
public static function data(Contact $contact): array
{
$notes = $contact->notes()->orderBy('created_at', 'desc')->take(3)->get();
$notesCollection = $notes->map(function ($note) use ($contact) {
return self::dto($contact, $note);
});

return [
'notes' => $notesCollection,
'url' => [
'store' => route('contact.note.store', [
'vault' => $contact->vault_id,
'contact' => $contact->id,
]),
'index' => route('contact.note.index', [
'vault' => $contact->vault_id,
'contact' => $contact->id,
]),
],
];
}

public static function dto(Contact $contact, Note $note): array
{
return [
'id' => $note->id,
'body' => $note->body,
'title' => $note->title,
'author' => $note->author ? $note->author->name : $note->author_name,
'written_at' => DateHelper::formatDate($note->created_at),
'url' => [
'update' => route('contact.note.update', [
'vault' => $contact->vault_id,
'contact' => $contact->id,
'note' => $note->id,
]),
'destroy' => route('contact.note.destroy', [
'vault' => $contact->vault_id,
'contact' => $contact->id,
'note' => $note->id,
]),
],
];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,45 +2,52 @@

namespace App\Http\Controllers\Vault\Contact\ViewHelpers;

use App\Models\Module;
use App\Models\Contact;
use App\Models\TemplatePage;
use Illuminate\Support\Collection;
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
use App\Http\Controllers\Vault\Contact\Modules\ViewHelpers\ModuleNotesViewHelper;

class ContactShowViewHelper
{
public static function data(Contact $contact): array
{
$template = $contact->template;
$templatePages = $contact->template->pages()->orderBy('position', 'asc')->get();

if ($template) {
$templatePages = $template->pages()->orderBy('position', 'asc')->get();
}
// get the first page to display in this default page
$firstPage = $templatePages->filter(function ($page) {
return $page->type != TemplatePage::TYPE_CONTACT;
})->first();

return [
'template_pages' => $template ? self::getTemplatePagesList($templatePages, $contact) : null,
'contact_information' => $template ? self::getContactInformation($templatePages->first(), $contact) : null,
'url' => [
],
'template_pages' => self::getTemplatePagesList($templatePages, $contact),
'contact_information' => self::getContactInformation($templatePages, $contact),
'modules' => $firstPage ? self::modules($firstPage, $contact) : [],
];
}

private static function getTemplatePagesList(EloquentCollection $templatePages, Contact $contact): Collection
{
$templatePages = $templatePages->filter(function ($page) {
return $page->type != TemplatePage::TYPE_CONTACT;
});

$pagesCollection = collect();
foreach ($templatePages as $page) {
if (! $page->can_be_deleted) {
if ($page->type == TemplatePage::TYPE_CONTACT) {
continue;
}

$pagesCollection->push([
'id' => $page->id,
'name' => $page->name,
'selected' => $page->id === $templatePages->first()->id,
'url' => [
'show' => route('contact.page.show', [
'vault' => $contact->vault->id,
'contact' => $contact->id,
'page' => $page->id,
'slug' => $page->slug,
]),
],
]);
Expand All @@ -49,10 +56,34 @@ private static function getTemplatePagesList(EloquentCollection $templatePages,
return $pagesCollection;
}

private static function getContactInformation(TemplatePage $templatePage, Contact $contact): array
private static function getContactInformation(EloquentCollection $templatePages, Contact $contact): array
{
$contactInformationPage = $templatePages->where('type', TemplatePage::TYPE_CONTACT)->first();

return [
'todo',
];
}

/**
* Get the modules list and data in the given page.
*/
public static function modules(TemplatePage $page, Contact $contact): Collection
{
$modules = $page->modules()->orderBy('position', 'asc')->get();

$modulesCollection = collect();
foreach ($modules as $module) {
if ($module->type == Module::TYPE_NOTES) {
$data = ModuleNotesViewHelper::data($contact);
}

$modulesCollection->push([
'id' => $module->id,
'type' => $module->type,
'data' => $data,
]);
}

return $modulesCollection;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
use App\Models\Vault;
use App\Helpers\VaultHelper;

// TODO
class VaultSettingsIndexViewHelper
{
public static function data(Vault $vault): array
Expand Down
5 changes: 3 additions & 2 deletions app/Jobs/SetupAccount.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace App\Jobs;

use App\Models\User;
use App\Models\Module;
use App\Models\Template;
use App\Models\Attribute;
use App\Models\Information;
Expand Down Expand Up @@ -131,7 +132,7 @@ private function addModules(): void
'account_id' => $this->user->account_id,
'author_id' => $this->user->id,
'name' => trans('app.module_names'),
'type' => 'contact_names',
'type' => Module::TYPE_CONTACT_NAMES,
'can_be_deleted' => false,
]);
(new AssociateModuleToTemplatePage)->execute([
Expand All @@ -146,7 +147,7 @@ private function addModules(): void
'account_id' => $this->user->account_id,
'author_id' => $this->user->id,
'name' => trans('app.module_notes'),
'type' => 'notes',
'type' => Module::TYPE_NOTES,
'can_be_deleted' => false,
]);
}
Expand Down
6 changes: 6 additions & 0 deletions app/Models/Module.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ class Module extends Model
{
use HasFactory;

/**
* Possible module types.
*/
const TYPE_NOTES = 'notes';
const TYPE_CONTACT_NAMES = 'contact_names';

/**
* The attributes that are mass assignable.
*
Expand Down
1 change: 1 addition & 0 deletions app/Models/TemplatePage.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class TemplatePage extends Model
'template_id',
'name',
'position',
'slug',
'can_be_deleted',
'type',
];
Expand Down
2 changes: 2 additions & 0 deletions app/Services/Account/ManageTemplate/CreateTemplatePage.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace App\Services\Account\ManageTemplate;

use App\Models\Template;
use Illuminate\Support\Str;
use App\Models\TemplatePage;
use App\Services\BaseService;
use App\Interfaces\ServiceInterface;
Expand Down Expand Up @@ -64,6 +65,7 @@ public function execute(array $data): TemplatePage
$this->templatePage = TemplatePage::create([
'template_id' => $data['template_id'],
'name' => $data['name'],
'slug' => Str::slug($data['name'], '-'),
'type' => $this->valueOrNull($data, 'type'),
'position' => $newPosition,
'can_be_deleted' => $this->valueOrTrue($data, 'can_be_deleted'),
Expand Down
2 changes: 2 additions & 0 deletions app/Services/Account/ManageTemplate/UpdateTemplatePage.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace App\Services\Account\ManageTemplate;

use App\Models\Template;
use Illuminate\Support\Str;
use App\Models\TemplatePage;
use App\Services\BaseService;
use App\Interfaces\ServiceInterface;
Expand Down Expand Up @@ -58,6 +59,7 @@ public function execute(array $data): TemplatePage
->findOrFail($data['template_page_id']);

$this->templatePage->name = $data['name'];
$this->templatePage->slug = Str::slug($data['name'], '-');
$this->templatePage->save();

return $this->templatePage;
Expand Down
6 changes: 6 additions & 0 deletions app/Services/Vault/ManageVault/CreateVault.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,16 @@ public function execute(array $data): Vault

private function createVault(): void
{
// the vault default's template should be the first template in the
// account, if it exists
$template = $this->author->account->templates()->first();

$this->vault = Vault::create([
'account_id' => $this->data['account_id'],
'type' => $this->data['type'],
'name' => $this->data['name'],
'description' => $this->valueOrNull($this->data, 'description'),
'default_template_id' => $template ? $template->id : null,
]);
}

Expand All @@ -77,6 +82,7 @@ private function createUserContact(): void
'first_name' => $this->author->first_name,
'last_name' => $this->author->last_name,
'can_be_deleted' => false,
'template_id' => $this->vault->default_template_id,
]);

$this->vault->users()->save($this->author, [
Expand Down
Loading

0 comments on commit a30ec99

Please sign in to comment.