Skip to content

refactor: change code for improved readability and maintainability #4

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions .env.testing
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:FwpumMyUcvG3z+MSQjaXBoJydVKC24+QqzN2VZxzJSc=
APP_DEBUG=true
APP_URL=http://localhost:8080

LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=testing
DB_USERNAME=sail
DB_PASSWORD=password

BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

MEMCACHED_HOST=127.0.0.1

MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="[email protected]"
MAIL_FROM_NAME="${APP_NAME}"

L5_SWAGGER_CONST_HOST=${APP_URL}/api
29 changes: 29 additions & 0 deletions ANSWER.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Eleven Soft Backend Refactoring Test Answers

Adicionado o Dockerfile para subir o ambiente através de containers docker

Adicionado o arquivo .env.testing para a base de dados de teste

No Arquivo README.md nos itens Instalation and Setup e Documentation o endereço esta com a porta errada ao invés de 8000 é 8080

Criado a pasta Api/v1 dentro de Controllers para criar tipo um versionamento das apis.

Utilização do Laravel Passport para garantir maior segurança nas operações de Crud, permitindo que somente usuários devidamente logados possam inserir, recuperar, atualizarinserir, atualizar, deleta

Utiliização de RepositoryPattern para separar lógica de acesso a dados e a lógica da camada de negócio.

Utilização de FormRequests no Crud para validar os dados enviados pela requisição antes de processa-los, dentre os beneficios estão separação de responsabilidades, centralização das regras de validações, melhor segurança

Método Index retorna a listagem de todos os usuários cadastrados, por esse motivo foi adicionada paginação para evitar possível sobrecarregamento da API, podendo causar um timeout

Pensando na gestão dos dados do usuário, e que o mesmo poderá apenas alterar a senha, no update de usuários, não será permitido alterar a senha, a alteração da senha será feita em uma api especifica para alteração de senha.

Utilização de Resources para estruturar e formatar os dados da Model a serem retornados

No Método delete, foi adicionado a trait de Softdeletes, e adicionado a coluna deleted_at na migration, para evitar a exclusão fisica do usuário e apenas inativá-lo, pois para exclusão do usuário, caso tenha dados em outra tabela associado a ele, estes dados também deverão ser excluídos, e podem ser dados sensíveis que não poderam ser excluídos.

Adicionado Testes Unitários e de Integração para garantir que o código alterado não afetem o comportamento da aplicação

Adicionado blocos try catch para tratamento de erros na controller
Adicionado Códigos HTTP de acordo com as respostas das solicitações,
201 para inserção, 200 para lista, edição e atulização e 500 para erros no bloco Catch
77 changes: 77 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
FROM ubuntu:22.04

LABEL maintainer="Taylor Otwell"

ARG WWWGROUP

WORKDIR /var/www/html

ENV DEBIAN_FRONTEND noninteractive
ENV TZ=UTC

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone


RUN apt-get update \
&& apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 \
&& mkdir -p ~/.gnupg \
&& chmod 600 ~/.gnupg \
&& echo "disable-ipv6" >> ~/.gnupg/dirmngr.conf \
&& apt-key adv --homedir ~/.gnupg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys E5267A6C \
&& apt-key adv --homedir ~/.gnupg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C300EE8C \
&& echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu focal main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
&& apt-get update \
&& apt-get install -y php82-cli php82-dev \
php82-pgsql php82-sqlite3 php82-gd \
php82-curl php82-memcached \
php82-imap php82-mysql php82-mbstring \
php82-xml php82-zip php82-bcmath php82-soap \
php82-intl php82-readline \
php82-msgpack php82-igbinary php82-ldap \
php82-redis php82-mbstring \
&& php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer \
&& curl -sL https://deb.nodesource.com/setup_16.x | bash - \
&& apt-get install -y nodejs \
&& curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
&& apt-get update \
&& apt-get install -y yarn \
&& apt-get install -y mysql-client \
&& apt-get install -y postgresql-client \
&& apt-get -y autoremove \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*



# RUN pecl channel-update https://pecl.php.net/channel.xml \
# && pecl install swoole \
# && pecl clear-cache \
# && rm -rf /tmp/* /var/tmp/*




RUN setcap "cap_net_bind_service=+ep" /usr/bin/php82

RUN useradd -m sail
RUN usermod -aG sudo sail

# RUN groupadd --force -g $WWWGROUP sail
# RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail

RUN curl -fsSL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get install -y nodejs

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer


COPY . /var/www/html/
COPY resources/docker/app/start-container /usr/local/bin/start-container
COPY resources/docker/app/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY resources/docker/app/php.ini /etc/php/82/cli/conf.d/99-sail.ini
RUN chmod +x /usr/local/bin/start-container

EXPOSE 80

ENTRYPOINT ["start-container"]
113 changes: 113 additions & 0 deletions app/Http/Controllers/Api/v1/Auth/AuthController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
<?php

namespace App\Http\Controllers\Api\v1\Auth;

use Illuminate\Http\JsonResponse;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\Auth\AuthFormRequest;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
public function __construct()
{
}

/**
* Make a login
*
* @return JsonResponse
*
* @OA\Post(
* path="/v1/auth/login",
* operationId="Login",
* summary="Autehticate with valid user",
* tags={"Auth"},
* description="Make a Login",
*
* @OA\RequestBody(
* required=true,
* description="Provide All Info Below",
* @OA\JsonContent(
* required={"email","password"},
* @OA\Property(property="email", type="email", format="text", example="[email protected]"),
* @OA\Property(property="password", type="string", format="text", example="password"),
* ),
* ),
* @OA\Response(
* response=200,
* description="Successful operation",
* @OA\JsonContent(ref="#/components/schemas/User")
* ),
* @OA\Response(
* response=401,
* description="Unauthenticated",
* ),
* @OA\Response(
* response=403,
* description="Forbidden"
* )
* )
*/
public function login(AuthFormRequest $request)
{
$data = [
'email' => $request->email,
'password' => $request->password
];

if (auth()->attempt($data)) {
$token = auth()->user()->createToken('LaravelAuthApp')->accessToken;
$data = [
'message' => 'Login efetuado com sucesso',
'user' => Auth::user(),
'token' => $token
];
return response()->json($data, JsonResponse::HTTP_OK);
} else {
return response()->json(['error' => 'Unauthorised'], JsonResponse::HTTP_UNAUTHORIZED);
}
}

/**
* Make a login
*
* @return JsonResponse
*
* @OA\Get(
* path="/v1/auth/me",
* operationId="Get User logged data",
* summary="Return infos of user logged",
* tags={"Auth"},
* description="Get User logged data",
* security={
* {"bearerAuth": {}}
* },
* @OA\Response(
* response=200,
* description="Successful operation",
* @OA\JsonContent(ref="#/components/schemas/User")
* ),
* @OA\Response(
* response=401,
* description="Unauthenticated",
* ),
* @OA\Response(
* response=403,
* description="Forbidden"
* )
* )
*/
public function me(): JsonResponse
{
return response()->json(['user' => Auth::user()], JsonResponse::HTTP_OK);
}

public function logout(Request $request): JsonResponse
{
$request->user()->tokens()->delete();

return response()->json(['Logout efetuado com sucesso'], JsonResponse::HTTP_OK);
}
}
Loading