Compare commits

..

10 Commits

11 changed files with 108 additions and 136 deletions

View File

@@ -1 +1,2 @@
Options -Indexes
Deny from all

View File

@@ -1,10 +1,29 @@
# Stage 1 - the build process
FROM composer:1.7.1 as build-deps
ENV COMPOSER_ALLOW_SUPERUSER 1
WORKDIR /root
COPY . .
RUN composer install
RUN composer test
# Stage 2 - the production environment
FROM ubuntu:16.04
# Updating
RUN apt-get -y update && apt-get -y upgrade
# Installing php, apache and supplementary software
RUN apt-get -y install apache2 php7.0 libapache2-mod-php7.0 php7.0-cli php7.0-common php7.0-mbstring php7.0-gd php7.0-intl php7.0-xml php7.0-mysql php7.0-mcrypt php7.0-zip curl git unzip composer
RUN apt-get -y install apache2 \
php7.0 \
libapache2-mod-php7.0 \
php7.0-cli \
php7.0-common \
php7.0-mbstring \
php7.0-gd \
php7.0-intl \
php7.0-xml \
php7.0-mysql \
php7.0-mcrypt
# Enable apache mods
RUN a2enmod php7.0
@@ -20,24 +39,14 @@ ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
# Expose apache
EXPOSE 80
# Copy this repo into place.
ADD . /var/www/site
WORKDIR /var/www/site
COPY --from=build-deps /root .
# Testing permisions
RUN chmod 777 -R .
RUN touch logs/app.log
RUN chmod 777 logs/app.log
# Installing dependencies
RUN composer install
# Update the default apache site
ADD docker/apache-config.conf /etc/apache2/sites-enabled/000-default.conf
# Unit tests
RUN composer test
# Update the default apache site with the config we created.
ADD apache-config.conf /etc/apache2/sites-enabled/000-default.conf
# By default start up apache in the foreground, override with /bin/bash for interative
# By default start up apache in the foreground
CMD /usr/sbin/apache2ctl -D FOREGROUND

0
api-payroll/logs/app.log Executable file
View File

View File

@@ -1,3 +1,5 @@
allow from all
<IfModule mod_rewrite.c>
RewriteEngine On

View File

@@ -56,11 +56,11 @@ class EmployeeApplication{
* @return integer
*/
function saveNewPerson($firstName, $middleName, $lastName, $birthDate, $email, $phone){
$this->asserts->isNotEmpty($firstName, "The first name can't be empty.");
$this->asserts->isNotEmpty($middleName, "The middle name can't be empty.");
$this->asserts->isNotEmpty($birthDate, "The birth date can't be empty.");
$this->asserts->isNotEmpty($email, "The email can't be empty.");
$this->asserts->isNotEmpty($phone, "The phone number can't be empty.");
$this->asserts->firstName($firstName);
$this->asserts->middleName($middleName);
$this->asserts->birthDate($birthDate);
$this->asserts->email($email);
$this->asserts->phone($phone);
try {
$stmt = $this->pdo->prepare("INSERT INTO persons (firstName, middleName, lastName, birthDate, email, phone)
@@ -89,10 +89,6 @@ class EmployeeApplication{
* @return mixed
*/
function savePersonAsEmployee($idEmployeeType, $idPerson, $code, $contractType){
$this->asserts->higherThanZero($idEmployeeType, "idEmployeeType must be higher than 0");
$this->asserts->higherThanZero($idPerson, "idPerson must be higher than 0");
$this->asserts->isNotEmpty($code, "The code can't be empty.");
$this->asserts->isNotEmpty($contractType, "The contract type can't be empty.");
try {
$stmt = $this->pdo->prepare("INSERT INTO employees (idEmployeeType, idPerson, code, contractType)
VALUES (:idEmployeeType, :idPerson, :code, :contractType)");
@@ -119,29 +115,21 @@ class EmployeeApplication{
function saveNewEmployee($requestData){
// Getting and validating the data
$firstName = $requestData['firstName'];
$this->asserts->isNotEmpty($firstName, "The first name can't be empty.");
$this->asserts->isString($firstName, "The first name must be a string.");
$this->asserts->betweenLength($firstName, 1, 50, "The first name must have a length between 1 and 50 characters.");
$this->asserts->firstName($firstName);
$middleName = $requestData['middleName'];
$this->asserts->isNotEmpty($middleName, "The middle name can't be empty.");
$this->asserts->isString($middleName, "The middle name must be a string.");
$this->asserts->betweenLength($middleName, 1, 50, "The middle name must have a length between 1 and 50 characters.");
$this->asserts->middleName($middleName);
$lastName = isset($requestData['lastName'])
? $requestData['lastName']
: null;
$lastName = isset($requestData['lastName']) ? $requestData['lastName'] : null;
$birthDate = $requestData['birthDate'];
$this->asserts->isNotEmpty($birthDate, "The birth date can't be empty.");
$this->asserts->birthDate($birthDate);
$email = $requestData['email'];
$this->asserts->isNotEmpty($email, "The email can't be empty.");
$this->asserts->betweenLength($email, 1, 100, "The middle name must have a length between 1 and 100 characters.");
$this->asserts->email($email);
$phone = $requestData['phone'];
$this->asserts->isNotEmpty($phone, "The phone number can't be empty.");
$this->asserts->betweenLength($phone, 10, 10, "The phone number must be 10 digits without special characters.");
$this->asserts->phone($phone);
$idEmployeeType = $requestData{'idEmployeeType'};
$contractType = $requestData{'contractType'};
@@ -181,8 +169,6 @@ class EmployeeApplication{
* @return Integer
*/
function getIdPersonByIdEmployee($idEmployee){
$this->asserts->higherThanZero($idEmployee, "idEmployee must be higher than 0");
$stmt = $this->pdo->prepare("SELECT
COALESCE((SELECT
idPerson
@@ -203,12 +189,10 @@ class EmployeeApplication{
}
/**
* @param $code string
* @return integer
* @param $code
* @return mixed
*/
function getIdEmployeeTypeByCode($code){
$this->asserts->isNotEmpty($code, "The code can't be empty.");
$stmt = $this->pdo->prepare("SELECT COALESCE((SELECT
et.id
FROM
@@ -235,8 +219,6 @@ class EmployeeApplication{
* @return array
*/
function getEmployeeDataById($idEmployee){
$this->asserts->higherThanZero($idEmployee, "idEmployee must be higher than 0");
$stmt = $this->pdo->prepare("SELECT
p.id AS idPerson,
p.firstName,
@@ -271,8 +253,6 @@ class EmployeeApplication{
* @return array
*/
function proxyGetEmployeeDataById($idEmployee){
$this->asserts->higherThanZero($idEmployee, "idEmployee must be higher than 0");
$employeeData = $this->getEmployeeDataById($idEmployee);
$response = array(
@@ -299,8 +279,6 @@ class EmployeeApplication{
* @return array
*/
function getEmployeeDataByCode($code){
$this->asserts->isNotEmpty($code, "The code can't be empty.");
$idEmployee = $this->getIdEmployeeTypeByCode($code);
return $this->proxyGetEmployeeDataById($idEmployee);
@@ -316,13 +294,6 @@ class EmployeeApplication{
* @param $phone string
*/
function updatePerson($idPerson, $firstName, $middleName, $lastName, $birthDate, $email, $phone){
$this->asserts->higherThanZero($idPerson, "idPerson must be higher than 0");
$this->asserts->isNotEmpty($firstName, "The first name can't be empty.");
$this->asserts->isNotEmpty($middleName, "The middle name can't be empty.");
$this->asserts->isNotEmpty($birthDate, "The birth date can't be empty.");
$this->asserts->isNotEmpty($email, "The email can't be empty.");
$this->asserts->isNotEmpty($phone, "The phone number can't be empty.");
try {
$stmt = $this->pdo->prepare("UPDATE persons
SET
@@ -352,11 +323,6 @@ class EmployeeApplication{
* @param $contractType string
*/
function updateEmployee($idEmployee, $code, $idEmployeeType, $contractType){
$this->asserts->higherThanZero($idEmployee, "idEmployee must be higher than 0");
$this->asserts->isNotEmpty($code, "The code can't be empty.");
$this->asserts->higherThanZero($idEmployeeType, "idEmployeeType must be higher than 0");
$this->asserts->isNotEmpty($contractType, "The contract type can't be empty.");
try {
$stmt = $this->pdo->prepare("UPDATE employees
SET
@@ -383,42 +349,28 @@ class EmployeeApplication{
function updateEmployeeData($requestData){
// Getting and validating the data
$idEmployee = $requestData['idEmployee'];
$this->asserts->higherThanZero($idEmployee, "idEmployee must be higher than 0");
$idPerson = $this->getIdPersonByIdEmployee($idEmployee);
$this->asserts->higherThanZero($idPerson, "idPerson must be higher than 0");
$code = $requestData['code'];
$this->asserts->isNotEmpty($code, "The code can't be empty.");
$firstName = $requestData['firstName'];
$this->asserts->isNotEmpty($firstName, "The first name can't be empty.");
$this->asserts->isString($firstName, "The first name must be a string.");
$this->asserts->betweenLength($firstName, 1, 50, "The first name must have a length between 1 and 50 characters.");
$this->asserts->firstName($firstName);
$middleName = $requestData['middleName'];
$this->asserts->isNotEmpty($middleName, "The middle name can't be empty.");
$this->asserts->isString($middleName, "The middle name must be a string.");
$this->asserts->betweenLength($middleName, 1, 50, "The middle name must have a length between 1 and 50 characters.");
$this->asserts->middleName($middleName);
$lastName = isset($requestData['lastName']) ? $requestData['lastName'] : null;
$birthDate = $requestData['birthDate'];
$this->asserts->isNotEmpty($birthDate, "The birth date can't be empty.");
$this->asserts->birthDate($birthDate);
$email = $requestData['email'];
$this->asserts->isNotEmpty($email, "The email can't be empty.");
$this->asserts->betweenLength($email, 1, 100, "The middle name must have a length between 1 and 100 characters.");
$this->asserts->email($email);
$phone = $requestData['phone'];
$this->asserts->isNotEmpty($phone, "The phone number can't be empty.");
$this->asserts->betweenLength($phone, 10, 10, "The phone number must be 10 digits without special characters.");
$this->asserts->phone($phone);
$idEmployeeType = $requestData{'idEmployeeType'};
$this->asserts->higherThanZero($idEmployeeType, "idEmployeeType must be higher than 0");
$contractType = $requestData{'contractType'};
$this->asserts->isNotEmpty($contractType, "The contract type can't be empty.");
// Encrypting the sensitive data
$securedFirstName = $this->cryptographyService->encryptString($firstName);
@@ -452,8 +404,6 @@ class EmployeeApplication{
}
function disableEmployeeRecord($idEmployee){
$this->asserts->higherThanZero($idEmployee, "idEmployee must be higher than 0");
try {
$stmt = $this->pdo->prepare("UPDATE employees
SET
@@ -497,9 +447,6 @@ class EmployeeApplication{
return $results;
}
/**
* @return array
*/
function listAllActiveEmployees(){
$ids = $this->getIdEmployeeFromAllActiveEmployees();

View File

@@ -43,9 +43,7 @@ class SessionApplication{
* @return mixed
*/
function getPassword($userName){
$this->asserts->isNotEmpty($userName, "The username can't be empty");
$this->asserts->isString($userName, "The username must be a string.");
$this->asserts->betweenLength($userName, 1, 50, "The username must have a length between 1 and 50 characters.");
$this->asserts->userName($userName);
$stmt = $this->pdo->prepare("SELECT password FROM users WHERE name = :userName");
$stmt->execute(array(':userName' => $userName));
@@ -64,12 +62,8 @@ class SessionApplication{
* @throws Exception
*/
function newSession($userName, $password){
$this->asserts->isNotEmpty($userName, "The username can't be empty");
$this->asserts->isString($userName, "The username must be a string.");
$this->asserts->betweenLength($userName, 1, 50, "The username must have a length between 1 and 50 characters.");
$this->asserts->isNotEmpty($password, "The password can't be empty");
$this->asserts->isString($password, "The password must be a string.");
$this->asserts->betweenLength($password, 1, 50, "The password must have a length between 1 and 50 characters.");
$this->asserts->userName($userName);
$this->asserts->password($password);
$storedPassword = $this->getPassword($userName);
@@ -99,14 +93,6 @@ class SessionApplication{
* @throws Exception
*/
function login($userName, $password){
$this->asserts->isNotEmpty($userName, "The username can't be empty");
$this->asserts->isString($userName, "The username must be a string.");
$this->asserts->betweenLength($userName, 1, 50, "The username must have a length between 1 and 50 characters.");
$this->asserts->isNotEmpty($password, "The password can't be empty");
$this->asserts->isString($password, "The password must be a string.");
$this->asserts->betweenLength($password, 1, 50, "The password must have a length between 1 and 50 characters.");
if($this->newSession($userName, $password)){
return array('status' => 'success', 'message' => 'Logged in successfully.');
}

View File

@@ -6,54 +6,78 @@ use Respect\Validation\Validator as v;
class Asserts{
/**
* @param $string string
* @param $errorMessage string
* @param $string
* @throws Exception
*/
function isString($string, $errorMessage){
$validation = v::stringType()->validate($string);
function userName($string){
$validateFirstName = v::stringType()->notEmpty()->length(1, 50)->validate($string);
if(!$validation){
throw new Exception($errorMessage);
if(!$validateFirstName){
throw new Exception('The user name must be a string between 1 and 50 characters');
}
}
/**
* @param $string string
* @param $errorMessage string
* @param $string
* @throws Exception
*/
function isNotEmpty($string, $errorMessage){
$validation = v::notEmpty()->validate($string);
function password($string){
$validateFirstName = v::stringType()->notEmpty()->length(1, 50)->validate($string);
if(!$validation){
throw new Exception($errorMessage);
if(!$validateFirstName){
throw new Exception('The password must be a string between 1 and 50 characters');
}
}
/**
* @param $string string
* @param $min integer
* @param $max integer
* @param $errorMessage string
* @param $string
* @throws Exception
*/
function betweenLength($string, $min, $max, $errorMessage){
$validation = v::length($min, $max)->validate($string);
function firstName($string){
$validateFirstName = v::stringType()->notEmpty()->length(1, 100)->validate($string);
if(!$validation){
throw new Exception($errorMessage);
if(!$validateFirstName){
throw new Exception('The first name must be a string between 1 and 100 characters');
}
}
/**
* @param $number integer
* @param $errorMessage string
* @param $string
* @throws Exception
*/
function higherThanZero($number, $errorMessage){
if($number <= 0){
throw new Exception($errorMessage);
function middleName($string){
if(!v::stringType()->notEmpty()->length(1, 100)->validate($string)){
throw new Exception('The middle name must be a string between 1 and 100 characters');
}
}
/**
* @param $string
* @throws Exception
*/
function birthDate($string){
if(!v::date('Y-m-d')->notEmpty()->validate($string)){
throw new Exception('The birth date must be in the yyyy-mm-dd format');
}
}
/**
* @param $string
* @throws Exception
*/
function email($string){
if(!v::stringType()->notEmpty()->length(1, 100)->validate($string)){
throw new Exception('The email must be a string between 1 and 100 characters');
}
}
/**
* @param $string
* @throws Exception
*/
function phone($string){
if(!v::digit()->notEmpty()->length(10, 10)->validate($string)){
throw new Exception('The phone must be a numeric value of 10 digits');
}
}
}

View File

@@ -6,7 +6,7 @@ services:
ports:
- "8085:80"
volumes:
- api-payroll:/var/www/site
- ./volumes/apache-logs:/var/log/apache2
depends_on:
- mysql
mysql:
@@ -18,11 +18,11 @@ services:
ports:
- "3307:3307"
volumes:
- my-datavolume:/var/lib/mysql
- ./volumes/mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: '12345678'
MYSQL_USER: 'sloth'
MYSQL_PASS: '12345678'
volumes:
api-payroll:
my-datavolume:
mysql-data:
apache-logs:

2
volumes/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
mysql-data/
apache-logs/

1
volumes/README.md Normal file
View File

@@ -0,0 +1 @@
# Do not delete this directory, it'll contain the volumes created by the containers