Skip to content

Commit

Permalink
Merge pull request #1 from feat/base-boilerplate
Browse files Browse the repository at this point in the history
Add base boilerplate
  • Loading branch information
FaisalBudiono authored Apr 26, 2023
2 parents f0d38a2 + 97da422 commit 9bf8716
Show file tree
Hide file tree
Showing 116 changed files with 7,290 additions and 971 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
.env.backup
.env.production
.phpunit.result.cache
/code-coverage/
Homestead.json
Homestead.yaml
auth.json
Expand All @@ -19,3 +20,5 @@ yarn-error.log

supervisord.log
supervisord.pid

*/**/Dummy*.php
8 changes: 8 additions & 0 deletions app/Core/Date/DatetimeFormat.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace App\Core\Date;

enum DatetimeFormat: string
{
case ISO_WITH_MILLIS = 'Y-m-d\TH:i:s.vp';
}
11 changes: 11 additions & 0 deletions app/Core/Formatter/ExceptionErrorCode.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace App\Core\Formatter;

enum ExceptionErrorCode: string
{
case GENERIC = 'GENERIC';
case INVALID_VALIDATION = 'INVALID-STRUCTURE-VALIDATION';
case MODEL_NOT_FOUND = 'MODEL-NOT-FOUND';
case REQUIRE_AUTHORIZATION = 'REQUIRE-AUTH';
}
11 changes: 11 additions & 0 deletions app/Core/Formatter/ExceptionMessage/ExceptionMessage.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace App\Core\Formatter\ExceptionMessage;

use Illuminate\Support\Collection;

interface ExceptionMessage
{
public function getJsonResponse(): Collection;
public function getMessage(): string;
}
29 changes: 29 additions & 0 deletions app/Core/Formatter/ExceptionMessage/ExceptionMessageGeneric.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace App\Core\Formatter\ExceptionMessage;

use App\Core\Formatter\ExceptionErrorCode;
use Illuminate\Support\Collection;

class ExceptionMessageGeneric implements ExceptionMessage
{
protected ExceptionMessage $exceptionMessage;

public function __construct()
{
$this->exceptionMessage = new ExceptionMessageStandard(
'Something Wrong on Our Server',
ExceptionErrorCode::GENERIC->value
);
}

public function getJsonResponse(): Collection
{
return $this->exceptionMessage->getJsonResponse();
}

public function getMessage(): string
{
return $this->exceptionMessage->getMessage();
}
}
29 changes: 29 additions & 0 deletions app/Core/Formatter/ExceptionMessage/ExceptionMessageStandard.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace App\Core\Formatter\ExceptionMessage;

use Illuminate\Support\Collection;

class ExceptionMessageStandard implements ExceptionMessage
{
public function __construct(
protected string $errorMessage,
protected string $errorCode,
protected ?array $meta = [],
) {
}

public function getJsonResponse(): Collection
{
return collect([
'message' => $this->errorMessage,
'errorCode' => $this->errorCode,
'meta' => $this->meta,
]);
}

public function getMessage(): string
{
return $this->errorMessage;
}
}
8 changes: 8 additions & 0 deletions app/Core/Formatter/Randomizer/Randomizer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace App\Core\Formatter\Randomizer;

interface Randomizer
{
public function getRandomizeString(): string;
}
13 changes: 13 additions & 0 deletions app/Core/Formatter/Randomizer/RandomizerUUID.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace App\Core\Formatter\Randomizer;

use Illuminate\Support\Str;

class RandomizerUUID implements Randomizer
{
public function getRandomizeString(): string
{
return Str::uuid();
}
}
8 changes: 8 additions & 0 deletions app/Core/Logger/MessageFormatter/LoggerMessageFormatter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace App\Core\Logger\MessageFormatter;

interface LoggerMessageFormatter
{
public function getMessage(): string;
}
22 changes: 22 additions & 0 deletions app/Core/Logger/MessageFormatter/LoggerMessageFormatterFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace App\Core\Logger\MessageFormatter;

class LoggerMessageFormatterFactory implements LoggerMessageFormatterFactoryContract
{
public function makeGeneric(
string $endpoint,
string $requestID,
ProcessingStatus $processingStatus,
string $message,
array $meta,
): LoggerMessageFormatter {
return new LoggerMessageFormatterGeneric(
$endpoint,
$requestID,
$processingStatus,
$message,
$meta,
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace App\Core\Logger\MessageFormatter;

interface LoggerMessageFormatterFactoryContract
{
public function makeGeneric(
string $endpoint,
string $requestID,
ProcessingStatus $processingStatus,
string $message,
array $meta,
): LoggerMessageFormatter;
}
27 changes: 27 additions & 0 deletions app/Core/Logger/MessageFormatter/LoggerMessageFormatterGeneric.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace App\Core\Logger\MessageFormatter;

class LoggerMessageFormatterGeneric implements LoggerMessageFormatter
{
public function __construct(
protected string $endpoint,
protected string $requestID,
protected ProcessingStatus $processingStatus,
protected string $message,
protected array $meta,
) {
$this->meta = $meta;
}

public function getMessage(): string
{
return json_encode([
'endpoint' => $this->endpoint,
'request-id' => $this->requestID,
'processing-status' => $this->processingStatus->value,
'message' => $this->message,
'meta' => $this->meta,
]);
}
}
11 changes: 11 additions & 0 deletions app/Core/Logger/MessageFormatter/ProcessingStatus.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace App\Core\Logger\MessageFormatter;

enum ProcessingStatus: string
{
case BEGIN = "BEGIN";
case ERROR = "ERROR";
case PROCESSING = "PROCESSING";
case SUCCESS = "SUCCESS";
}
9 changes: 9 additions & 0 deletions app/Core/Query/OrderDirection.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php

namespace App\Core\Query;

enum OrderDirection: string
{
case ASCENDING = 'asc';
case DESCENDING = 'desc';
}
10 changes: 10 additions & 0 deletions app/Core/User/Query/UserOrderBy.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace App\Core\User\Query;

enum UserOrderBy: string
{
case NAME = 'name';
case EMAIL = 'email';
case CREATED_AT = 'created_at';
}
107 changes: 107 additions & 0 deletions app/Core/User/UserCore.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
<?php

namespace App\Core\User;

use App\Core\Formatter\ExceptionMessage\ExceptionMessageStandard;
use App\Core\Query\OrderDirection;
use App\Core\User\Query\UserOrderBy;
use App\Exceptions\Core\User\UserEmailDuplicatedException;
use App\Models\User\Enum\UserExceptionCode;
use App\Models\User\User;
use App\Port\Core\User\CreateUserPort;
use App\Port\Core\User\DeleteUserPort;
use App\Port\Core\User\GetAllUserPort;
use App\Port\Core\User\GetUserPort;
use App\Port\Core\User\UpdateUserPort;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class UserCore implements UserCoreContract
{
public function create(CreateUserPort $request): User
{
try {
DB::beginTransaction();

$isEmailExist = User::query()
->where('email', $request->getEmail())
->exists();
if ($isEmailExist) {
throw new UserEmailDuplicatedException(new ExceptionMessageStandard(
'Email is duplicated',
UserExceptionCode::DUPLICATED->value,
));
}

$user = new User;
$user->name = $request->getName();
$user->email = $request->getEmail();
$user->password = Hash::make($request->getUserPassword());
$user->save();

DB::commit();

return $user;
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
}

public function delete(DeleteUserPort $request): void
{
$user = $request->getUserModel();
$user->delete();
}

public function get(GetUserPort $request): User
{
return $request->getUserModel();
}

public function getAll(GetAllUserPort $request): LengthAwarePaginator
{
$page = $request->getPage() ?? 1;
$perPage = $request->getPerPage() ?? 30;
$orderDirection = $request->getOrderDirection() ?? OrderDirection::DESCENDING;
$orderBy = $request->getOrderBy() ?? UserOrderBy::CREATED_AT;

return User::query()
->orderBy($orderBy->value, $orderDirection->value)
->paginate($perPage, ['*'], 'page', $page);
}

public function update(UpdateUserPort $request): User
{
try {
DB::beginTransaction();

$user = $request->getUserModel();
$email = $request->getEmail();

$isEmailExist = User::query()
->where('email', $email)
->where('id', '<>', $user->id)
->exists();
if ($isEmailExist) {
throw new UserEmailDuplicatedException(new ExceptionMessageStandard(
'Email is already in used',
UserExceptionCode::DUPLICATED->value,
));
}

$user->name = $request->getName();
$user->email = $email;
$user->password = Hash::make($request->getUserPassword());
$user->save();

DB::commit();

return $user;
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
}
}
20 changes: 20 additions & 0 deletions app/Core/User/UserCoreContract.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace App\Core\User;

use App\Models\User\User;
use App\Port\Core\User\CreateUserPort;
use App\Port\Core\User\DeleteUserPort;
use App\Port\Core\User\GetAllUserPort;
use App\Port\Core\User\GetUserPort;
use App\Port\Core\User\UpdateUserPort;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;

interface UserCoreContract
{
public function create(CreateUserPort $request): User;
public function delete(DeleteUserPort $request): void;
public function get(GetUserPort $request): User;
public function getAll(GetAllUserPort $request): LengthAwarePaginator;
public function update(UpdateUserPort $request): User;
}
20 changes: 20 additions & 0 deletions app/Exceptions/BaseException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace App\Exceptions;

use App\Core\Formatter\ExceptionMessage\ExceptionMessage;
use Exception;

abstract class BaseException extends Exception
{
public function __construct(
public readonly ExceptionMessage $exceptionMessage,
?\Throwable $previousException = null
) {
parent::__construct(
$this->exceptionMessage->getJsonResponse()->toJson(),
0,
$previousException
);
}
}
9 changes: 9 additions & 0 deletions app/Exceptions/Core/User/UserEmailDuplicatedException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php

namespace App\Exceptions\Core\User;

use App\Exceptions\BaseException;

class UserEmailDuplicatedException extends BaseException
{
}
Loading

0 comments on commit 9bf8716

Please sign in to comment.