Skip to content
This repository has been archived by the owner on Jan 25, 2023. It is now read-only.

Latest commit

 

History

History
792 lines (662 loc) · 17.4 KB

README.md

File metadata and controls

792 lines (662 loc) · 17.4 KB

REST Api with Slim PHP

This API works with the same concept of social network of Fav Quote.

This is a simple REST Web Service which allow:

  • Post short text messages of no more than 120 characters
  • Bring a list with the latest published messages
  • Search for messages by your text
  • Delete a specific message by its id

🚥 Getting Started

This page will help you get started with this API.

Requirements

  • PHP 5.6
  • MySQL or MariaDB
  • Apache Server
  • Slim Framework v3

Installation

Copy this project

  1. Clone or Download this repository
  2. Unzip the archive if needed
  3. Copy the folder in the htdocs dir
  4. Start a Text Editor (Atom, Sublime, Visual Studio Code, Vim, etc)
  5. Add the project folder to the editor

Install the project

  1. Go to htdocs dir
  • Windows
$ cd /d C:\xampp\htdocs
  • Linux
$ cd /opt/lampp/htdocs
  • MAC
$ cd applications/mamp/htdocs
  1. Go to the project folder
$ cd REST-Api-with-Slim-PHP
  1. Install with composer
$ composer install

Or

$ sudo php composer.phar install

Create a database

Import the NETWORK SCHEMA DDL.sql file.

Import the NETWORK SCHEMA DML.sql file.

Or run the following SQL script

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT=0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

START TRANSACTION;

-- -----------------------------------------------------
-- Schema NETWORK
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `NETWORK` DEFAULT CHARACTER SET utf8 ;
USE `NETWORK` ;

-- -----------------------------------------------------
-- Table `NETWORK`.`COUNTRIES`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `NETWORK`.`COUNTRIES` (
  `ID_COUNTRY` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `ISO` VARCHAR(2) NOT NULL,
  `COUNTRY` VARCHAR(80) NOT NULL,
  PRIMARY KEY (`ID_COUNTRY`))
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Dumping data for table `NETWORK`.`COUNTRIES`
-- -----------------------------------------------------
INSERT INTO `NETWORK`.`COUNTRIES` (`ID_COUNTRY`, `ISO`, `COUNTRY`) VALUES
(1, 'AF', 'Afghanistan');

-- -----------------------------------------------------
-- Table `NETWORK`.`USERS`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `NETWORK`.`USERS` (
  `ID_USER` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `GUID` VARCHAR(20) NOT NULL,
  `TOKEN` VARCHAR(255) DEFAULT NULL,
  `USERNAME` VARCHAR(20) NOT NULL,
  `PASSWORD` VARCHAR(255) NOT NULL,
  `CREATED_AT` DATE NOT NULL,
  `STATUS` TINYINT(1) NOT NULL DEFAULT '0',
  `ID_COUNTRY` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`ID_USER`),
  UNIQUE INDEX `ID_USER_UNIQUE` (`ID_USER` ASC),
  UNIQUE INDEX `USER_UNIQUE` (`USERNAME` ASC),
  UNIQUE INDEX `GUID_UNIQUE` (`GUID` ASC),
  INDEX `fk_USERS_COUNTRIES1_idx` (`ID_COUNTRY` ASC),
  CONSTRAINT `fk_USERS_COUNTRIES1`
    FOREIGN KEY (`ID_COUNTRY`)
    REFERENCES `NETWORK`.`COUNTRIES` (`ID_COUNTRY`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Dumping data for table `NETWORK`.`USERS`
-- -----------------------------------------------------
INSERT INTO `users` (`ID_USER`, `GUID`, `TOKEN`, `USERNAME`, `PASSWORD`, `CREATED_AT`, `STATUS`, `ID_COUNTRY`) VALUES
(0, '5acff05a49592', NULL, 'ManuelGil', '', '2018-01-01', 1, 47),
(1, '5ba4524f296c3', NULL, 'testUser', '$2y$10$dRWUrwXE56p3zvEadmnMYeFivd6aU9BfGb4LXsmf5p.xQlkTAX/V6', '2018-01-01', 1, 1);

-- -----------------------------------------------------
-- Table `NETWORK`.`QUOTES`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `NETWORK`.`QUOTES` (
  `ID_QUOTE` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `QUOTE` VARCHAR(120) NOT NULL,
  `POST_DATE` DATE NOT NULL,
  `POST_TIME` TIME NOT NULL,
  `LIKES` INT UNSIGNED NOT NULL DEFAULT 0,
  `ID_USER` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`ID_QUOTE`),
  UNIQUE INDEX `ID_QUOTE_UNIQUE` (`ID_QUOTE` ASC),
  INDEX `fk_QUOTES_USERS_idx` (`ID_USER` ASC),
  CONSTRAINT `fk_QUOTES_USERS`
    FOREIGN KEY (`ID_USER`)
    REFERENCES `NETWORK`.`USERS` (`ID_USER`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Dumping data for table `NETWORK`.`QUOTES`
-- -----------------------------------------------------
INSERT INTO `NETWORK`.`QUOTES` (`ID_QUOTE`, `QUOTE`, `POST_DATE`, `POST_TIME`, `LIKES`, `ID_USER`) VALUES
(0, 'Fav Quote is a Micro Social Network with PHP, MySQL, Bootstrap 3 and Vue.JS 2. It don\'t use classes or a php framework.', '2018-01-01', '00:00:00', 1, 0);

-- -----------------------------------------------------
-- Table `NETWORK`.`LIKES`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `NETWORK`.`LIKES` (
  `ID_USER` INT UNSIGNED NOT NULL,
  `ID_QUOTE` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`ID_USER`, `ID_QUOTE`),
  INDEX `fk_LIKES_QUOTES1_idx` (`ID_QUOTE` ASC),
  CONSTRAINT `fk_LIKES_USERS1`
    FOREIGN KEY (`ID_USER`)
    REFERENCES `NETWORK`.`USERS` (`ID_USER`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_LIKES_QUOTES1`
    FOREIGN KEY (`ID_QUOTE`)
    REFERENCES `NETWORK`.`QUOTES` (`ID_QUOTE`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

COMMIT;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Configure the project

Copy the .env.example file and call it .env.

Change the database configuration in the new file.

🎁 Donate!

If you want to help me to continue this project, you might donate via PayPal.

Donate via PayPal

📦 Deployment

Database Schema

Routes

  • get => /ping - This method is used for testing the api. e.g.:

    uri = http://localhost/REST-Api-with-Slim-PHP/public/webresources/mobile_app/ping

  • get => /login/{user}/{password} - This method gets a user into the database. e.g.:

    uri = http://localhost/REST-Api-with-Slim-PHP/public/webresources/mobile_app/login/testUser/testPwd

      parameters = [
        /** @var string $user - username */
        string	$user	=>	"testUser",
        /** @var string $password - password */
        string	$password	=>	"testPwd"
      ]
  • post => /register - This method sets a user into the database. e.g.:

    uri = http://localhost/REST-Api-with-Slim-PHP/public/webresources/mobile_app/register

      parameters = [
        /** @var string $user - username */
        string	$user	=>	"testUser",
        /** @var string $password - password */
        string	$password	=>	"testPwd",
        /** @var string $email - password */
        string	$email	=>	"[email protected]",
        /** @var int $country - country id */
        int	$country	=>	1
      ]
  • get => /validate/{user}/{token} - This method verify the user account. e.g.:

    uri = http://localhost/REST-Api-with-Slim-PHP/public/webresources/mobile_app/validate/testUser/326f0911657d94d0a48530058ca2a383

      parameters = [
        /** @var string $user - username */
        string	$user	=>	"testUser",
        /** @var string $token - token validation */
        string	$token	=>	"326f0911657d94d0a48530058ca2a383"
      ]
  • put => /update - This method sets a user into the database. e.g.:

    uri = http://localhost/REST-Api-with-Slim-PHP/public/webresources/mobile_app/update

      parameters = [
        /** @var int $country - country id */
        int	$country	=>	1
      ]
  • get => /verify - This method checks the token. e.g.:

    uri = http://localhost/REST-Api-with-Slim-PHP/public/webresources/mobile_app/verify

      headers = [
        /** @var string $authorization - JWT Authentication */
        string	$authorization	=>	"Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJoZWFkZXIiOnsiaWQiOjEsInVzZXIiOiJ0ZXN0VXNlciJ9LCJwYXlsb2FkIjp7ImlhdCI6IjIwMTktMDEtMDEgMDA6MDA6MDAiLCJleHAiOiIyMDIwLTAxLTAxIDAwOjAwOjAwIn19.RTTPlUqE--WMP9M28-oj7p8MhWdisuuhWBsioDa_bgY"
      ]
  • post => /post - This method publish short text messages of no more than 120 characters. e.g.:

    uri = http://localhost/REST-Api-with-Slim-PHP/public/webresources/mobile_app/post

      parameters = [
        /** @var string $quote - quote */
        string	$quote	=>	"test",
        /** @var int $id - user id */
        int	$id	=>	1
      ]
  • get => /list - This method list the latest published messages. e.g.:

    uri = http://localhost/REST-Api-with-Slim-PHP/public/webresources/mobile_app/list

  • get => /likes/{id} - get method - This method list the users for likes. e.g.:

    uri = http://localhost/REST-Api-with-Slim-PHP/public/webresources/mobile_app/likes/1

      parameters = [
        /** @var int $id - quote id */
        int	$id	=>	1
      ]
  • get => /search/{quote} - get method - This method searches for messages by your text. e.g.:

    uri = http://localhost/REST-Api-with-Slim-PHP/public/webresources/mobile_app/search/quote

      parameters = [
        /** @var string $quote - text search */
        string	$quote	=>	"quote"
      ]
  • delete => /delete - delete method - This method deletes a specific message by its id. e.g.:

    uri = http://localhost/REST-Api-with-Slim-PHP/public/webresources/mobile_app/delete

      parameters = [
        /** @var int $id - quote id */
        int	$id	=>	1
      ]

💯 Running the tests

Use RestEasy or Postman app for testing.

For authentication you can generate a new JSON Web Token with the url login.

Put the parameters on a Query Parameter.

Put the token on an HTTP header called Authorization. e.g.:

  • Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJoZWFkZXIiOnsiaWQiOjEsInVzZXIiOiJ0ZXN0VXNlciJ9LCJwYXlsb2FkIjp7ImlhdCI6IjIwMTktMDEtMDEgMDA6MDA6MDAiLCJleHAiOiIyMDIwLTAxLTAxIDAwOjAwOjAwIn19.RTTPlUqE--WMP9M28-oj7p8MhWdisuuhWBsioDa_bgY
headers

Checks if the iat (issued at) and exp (expiration time) are correct in https://jwt.io/.

jwt

🔧 Built With

ℹ️ Changelog

1.0.0.8 (10/16/2019)

  • Language: PHP
    Requirements:
    • PHP 5.6
    • MySQL or MariaDB
    • Apache Server
    Changes:
    • Fix responses
    • Implements caches

1.0.0.7 (01/24/2019)

  • Language: PHP
    Requirements:
    • PHP 5.6
    • MySQL or MariaDB
    • Apache Server
    Changes:
    • New update-user route
    • Update send mail function
    • Update verify Authentication Token function

1.0.0.6 (01/19/2019)

  • Language: PHP
    Requirements:
    • PHP 5.6
    • MySQL or MariaDB
    • Apache Server
    Changes:
    • Setting up CORS

1.0.0.5 (09/23/2018)

  • Language: PHP
    Requirements:
    • PHP 5.6
    • MySQL or MariaDB
    • Apache Server
    Changes:
    • PHPMail integration
    • Protection of files with .htaccess
    • Improvement in documentation

1.0.0.4 (08/12/2018)

  • Language: PHP
    Requirements:
    • PHP 5.6
    • MySQL or MariaDB
    • Apache Server
    Changes:
    • TODO: Unit testing (Removed)

1.0.0.3 (07/07/2018)

  • Language: PHP
    Requirements:
    • PHP 5.6
    • MySQL or MariaDB
    • Apache Server
    Changes:
    • DotEnv integration

1.0.0.2 (03/29/2018)

  • Language: PHP
    Requirements:
    • PHP 5.6
    • MySQL or MariaDB
    • Apache Server
    Changes:
    • Add a new table in database to save likes
    • Add 3 methods (ping, register, likes)
    • Add logger with Monolog
    • Add JSON file for installation with composer

1.0.0.1 (12/07/2017)

👓 Authors

See also the list of contributors who participated in this project.

📝 License

This API is licensed under the MIT License - see the MIT License for details.