From c4bcf777e250c83640235c9bf0492be895e21192 Mon Sep 17 00:00:00 2001 From: Edwin Ngoma Date: Sat, 5 Nov 2022 16:44:36 +0200 Subject: [PATCH 1/3] [HIRFUS-153] Article Publishing Endpoints submission of slim task --- submissions/edwinNgoma/php_slim/.env.sample | 6 + submissions/edwinNgoma/php_slim/.gitignore | 5 + .../php_slim/API(s) collection & examples.txt | 1 + .../app/controllers/ArticlesController.php | 151 ++++++++++++++++++ .../php_slim/app/middleware/jsonBody.php | 28 ++++ .../edwinNgoma/php_slim/bootstrap/app.php | 15 ++ submissions/edwinNgoma/php_slim/composer.json | 17 ++ .../edwinNgoma/php_slim/database/DB.php | 34 ++++ .../edwinNgoma/php_slim/public/index.php | 18 +++ .../edwinNgoma/php_slim/routes/api.php | 22 +++ 10 files changed, 297 insertions(+) create mode 100644 submissions/edwinNgoma/php_slim/.env.sample create mode 100644 submissions/edwinNgoma/php_slim/.gitignore create mode 100644 submissions/edwinNgoma/php_slim/API(s) collection & examples.txt create mode 100644 submissions/edwinNgoma/php_slim/app/controllers/ArticlesController.php create mode 100644 submissions/edwinNgoma/php_slim/app/middleware/jsonBody.php create mode 100644 submissions/edwinNgoma/php_slim/bootstrap/app.php create mode 100644 submissions/edwinNgoma/php_slim/composer.json create mode 100644 submissions/edwinNgoma/php_slim/database/DB.php create mode 100644 submissions/edwinNgoma/php_slim/public/index.php create mode 100644 submissions/edwinNgoma/php_slim/routes/api.php diff --git a/submissions/edwinNgoma/php_slim/.env.sample b/submissions/edwinNgoma/php_slim/.env.sample new file mode 100644 index 000000000..3aa3f7a50 --- /dev/null +++ b/submissions/edwinNgoma/php_slim/.env.sample @@ -0,0 +1,6 @@ + # Database + + DB_HOSTNAME ="localhost" + DB_USERNAME ="root" + DB_PASSWORD ="articles" + DB_NAME ="publishing" diff --git a/submissions/edwinNgoma/php_slim/.gitignore b/submissions/edwinNgoma/php_slim/.gitignore new file mode 100644 index 000000000..40e4fcc45 --- /dev/null +++ b/submissions/edwinNgoma/php_slim/.gitignore @@ -0,0 +1,5 @@ +.env + +composer.lock + +vender \ No newline at end of file diff --git a/submissions/edwinNgoma/php_slim/API(s) collection & examples.txt b/submissions/edwinNgoma/php_slim/API(s) collection & examples.txt new file mode 100644 index 000000000..89ce899ed --- /dev/null +++ b/submissions/edwinNgoma/php_slim/API(s) collection & examples.txt @@ -0,0 +1 @@ +https://www.getpostman.com/collections/42a9b1930e25546d77ed \ No newline at end of file diff --git a/submissions/edwinNgoma/php_slim/app/controllers/ArticlesController.php b/submissions/edwinNgoma/php_slim/app/controllers/ArticlesController.php new file mode 100644 index 000000000..acfbb3b3a --- /dev/null +++ b/submissions/edwinNgoma/php_slim/app/controllers/ArticlesController.php @@ -0,0 +1,151 @@ +db = (new DB())->connect(); + } + + public function published(Request $request, Response $response){ + + try{ + $query = $this->db->prepare("SELECT * FROM articles WHERE status = 1"); + $query ->execute(); + $articles = $query->fetchAll(); + $response->getBody()->write(json_encode($articles)); + return $response->withHeader('CONTENT-TYPE', 'application/json')->withStatus(200); + } catch (PDOException $ex) { + $response->getBody()->write(json_encode(['error'=>$ex->getMessage()])); + return $response->withHeader('CONTENT-TYPE', 'application/json')->withStatus(500); + } + } + + public function article(Request $request, Response $response, $args){ + + $id = $args['id']; + + try{ + $query = $this->db->prepare("SELECT * FROM articles WHERE id = :id"); + $query->bindParam(':id',$id); + $query->execute(); + $articles = $query->fetch(); + if(!$articles){ + $response->getBody()->write(json_encode(['error'=>'Sorry, article not found!'])); + return $response->withHeader('CONTENT-TYPE', 'application/json')->withStatus(404); + } + $response->getBody()->write(json_encode($articles)); + return $response->withHeader('CONTENT-TYPE', 'application/json')->withStatus(200); + } catch (PDOException $ex) { + $response->getBody()->write(json_encode(['error'=>$ex->getMessage()])); + return $response->withHeader('CONTENT-TYPE', 'application/json')->withStatus(500); + } + } + + public function Add_article(Request $request, Response $response, $args){ + + $requestData = $request->getParsedBody(); + + $title = $requestData['title']; + $discription = $requestData['discription']; + $status = 0; + $created_by = $requestData['created_by']; + $created_at = Date('Y-m-d H:l:s'); + + $sql = "INSERT INTO articles (title, discription, status, created_by, created_at) VALUES (:title, :discription, :status, :created_by, :created_at)"; + + + try{ + $query = $this->db->prepare($sql); + $query->bindParam(':title',$title); + $query->bindParam(':discription',$discription); + $query->bindParam(':status',$status); + $query->bindParam(':created_by',$created_by); + $query->bindParam(':created_at',$created_at); + $query->execute(); + $response->getBody()->write(json_encode(['message'=>'Successfull!'])); + return $response->withHeader('CONTENT-TYPE', 'application/json')->withStatus(200); + } catch (PDOException $ex) { + $response->getBody()->write(json_encode(['error'=>$ex->getMessage()])); + return $response->withHeader('CONTENT-TYPE', 'application/json')->withStatus(500); + } + } + + public function modify(Request $request, Response $response, $args){ + + $requestData = $request->getParsedBody(); + + $id = $args['id']; + + $title = $requestData['title']; + $discription = $requestData['discription']; + $created_by = $requestData['created_by']; + $created_at = Date('Y-m-d H:l:s'); + + try{ + $query = $this->db->prepare("UPDATE articles SET title = :title, discription = :discription, created_by = :created_by, created_at = :created_at WHERE id = :id"); + $query->bindParam(':id',$id); + $query->bindParam(':title',$title); + $query->bindParam(':discription',$discription); + $query->bindParam(':created_by',$created_by); + $query->bindParam(':created_at',$created_at); + $query->execute(); + $response->getBody()->write(json_encode(['message'=>'Successfull!'])); + return $response->withHeader('CONTENT-TYPE', 'application/json')->withStatus(200); + } catch (PDOException $ex) { + $response->getBody()->write(json_encode(['error'=>$ex->getMessage()])); + return $response->withHeader('CONTENT-TYPE', 'application/json')->withStatus(500); + } + } + + public function publish(Request $request, Response $response, $args){ + + $requestData = $request->getParsedBody(); + + $id = $args['id']; + + $status = $requestData['status']; + + + try{ + $query = $this->db->prepare("UPDATE articles SET status = :status WHERE id=:id"); + $query->bindParam(':id',$id); + $query->bindParam(':status',$status); + $query->execute(); + $response->getBody()->write(json_encode(['message'=>'Successfull!'])); + return $response->withHeader('CONTENT-TYPE', 'application/json')->withStatus(200); + } catch (PDOException $ex) { + $response->getBody()->write(json_encode(['error'=>$ex->getMessage()])); + return $response->withHeader('CONTENT-TYPE', 'application/json')->withStatus(500); + } + } + + public function del(Request $request, Response $response, $args){ + + $id = $args['id']; + + try{ + $query = $this->db->prepare("DELETE FROM articles WHERE id = $id"); + $query->execute(); + $articles = $query; + if(!$articles){ + $response->getBody()->write(json_encode(['error'=>'Sorry, article not found!'])); + return $response->withHeader('CONTENT-TYPE', 'application/json')->withStatus(404); + } + $response->getBody()->write(json_encode(['message'=>'article was successfully deleted'])); + return $response->withHeader('CONTENT-TYPE', 'application/json')->withStatus(200); + } catch (PDOException $ex) { + $response->getBody()->write(json_encode(['error'=>$ex->getMessage()])); + return $response->withHeader('CONTENT-TYPE', 'application/json')->withStatus(500); + } + } + } \ No newline at end of file diff --git a/submissions/edwinNgoma/php_slim/app/middleware/jsonBody.php b/submissions/edwinNgoma/php_slim/app/middleware/jsonBody.php new file mode 100644 index 000000000..04860901c --- /dev/null +++ b/submissions/edwinNgoma/php_slim/app/middleware/jsonBody.php @@ -0,0 +1,28 @@ +getHeaderLine('Content-Type'); + + if (strstr($contentType, "application/json")){ + + $contents = json_decode(file_get_contents('php://input'), true); + + if(json_last_error() === JSON_ERROR_NONE){ + + $request = $request->withParsedBody($contents); + } + } + + return $handler->handle($request); + } + }; \ No newline at end of file diff --git a/submissions/edwinNgoma/php_slim/bootstrap/app.php b/submissions/edwinNgoma/php_slim/bootstrap/app.php new file mode 100644 index 000000000..ff2e53b66 --- /dev/null +++ b/submissions/edwinNgoma/php_slim/bootstrap/app.php @@ -0,0 +1,15 @@ +load(); + + # Insternsiasion + $app = AppFactory::create(); + + + require __DIR__ . './../routes/api.php'; \ No newline at end of file diff --git a/submissions/edwinNgoma/php_slim/composer.json b/submissions/edwinNgoma/php_slim/composer.json new file mode 100644 index 000000000..2e767119a --- /dev/null +++ b/submissions/edwinNgoma/php_slim/composer.json @@ -0,0 +1,17 @@ +{ + "name": "dufunaslim/task", + "description": "php slim api task", + "require": { + "slim/slim": "4.*", + "slim/psr7": "^1.5", + "vlucas/phpdotenv": "^5.4" + }, + + "autoload":{ + "psr-4": { + "DB\\":"database", + "App\\Controller\\": "app/Controllers", + "App\\Middleware\\": "app/middleware" + } + } +} diff --git a/submissions/edwinNgoma/php_slim/database/DB.php b/submissions/edwinNgoma/php_slim/database/DB.php new file mode 100644 index 000000000..c9376fb49 --- /dev/null +++ b/submissions/edwinNgoma/php_slim/database/DB.php @@ -0,0 +1,34 @@ +dbHostname = $_ENV['DB_HOSTNAME']; + + $this->dbUsername = $_ENV['DB_USERNAME']; + + $this->dbPassword = $_ENV['DB_PASSWORD']; + + $this->dbName = $_ENV['DB_NAME']; + } + + public function connect(){ + + $connectionString = "mysql:host={$this->dbHostname};dbname={$this->dbName}"; + $pdo = new PDO($connectionString, $this->dbUsername, $this->dbPassword); + $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); + return $pdo; + + } + + } \ No newline at end of file diff --git a/submissions/edwinNgoma/php_slim/public/index.php b/submissions/edwinNgoma/php_slim/public/index.php new file mode 100644 index 000000000..edce7bb9f --- /dev/null +++ b/submissions/edwinNgoma/php_slim/public/index.php @@ -0,0 +1,18 @@ +get('/', function ( Request $request, Response $response ){ + $response->getBody()->write("
+

WELCOME

+

to

+

Edy's Articles

+ It works thus far!!!
"); + return $response; + }); + + $app->run(); \ No newline at end of file diff --git a/submissions/edwinNgoma/php_slim/routes/api.php b/submissions/edwinNgoma/php_slim/routes/api.php new file mode 100644 index 000000000..56a58a293 --- /dev/null +++ b/submissions/edwinNgoma/php_slim/routes/api.php @@ -0,0 +1,22 @@ +group('/api', function(proxy $group){ + $group->get('/articles', ArticlesController::class . ":published"); + + $group->get('/articles/{id}', ArticlesController::class . ":article"); + + $group->post('/add', ArticlesController::class . ":Add_article") + ->add(new jsonBody()); + + $group->put('/modify/{id}', ArticlesController::class . ":modify") + ->add(new jsonBody()); + + $group->put('/publish/{id}', ArticlesController::class . ":publish") + ->add(new jsonBody()); + + $group->delete('/delete/{id}', ArticlesController::class . ":del"); + }); \ No newline at end of file From 96dce52f8268fc13df16b58d850962316eb9d3b7 Mon Sep 17 00:00:00 2001 From: Edwin Ngoma Date: Fri, 11 Nov 2022 23:46:33 +0200 Subject: [PATCH 2/3] edited the env.sample file and the gitignore file to better meet the conditions of the task and correcting an error --- submissions/edwinNgoma/php_slim/.env.sample | 8 ++++---- submissions/edwinNgoma/php_slim/.gitignore | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/submissions/edwinNgoma/php_slim/.env.sample b/submissions/edwinNgoma/php_slim/.env.sample index 3aa3f7a50..731c0a633 100644 --- a/submissions/edwinNgoma/php_slim/.env.sample +++ b/submissions/edwinNgoma/php_slim/.env.sample @@ -1,6 +1,6 @@ # Database - DB_HOSTNAME ="localhost" - DB_USERNAME ="root" - DB_PASSWORD ="articles" - DB_NAME ="publishing" + DB_HOSTNAME ="" + DB_USERNAME ="" + DB_PASSWORD ="" + DB_NAME ="" diff --git a/submissions/edwinNgoma/php_slim/.gitignore b/submissions/edwinNgoma/php_slim/.gitignore index 40e4fcc45..7b558b026 100644 --- a/submissions/edwinNgoma/php_slim/.gitignore +++ b/submissions/edwinNgoma/php_slim/.gitignore @@ -2,4 +2,4 @@ composer.lock -vender \ No newline at end of file +vendor \ No newline at end of file From 910e64ad62d1c63ea6586d5e9d8e5ef7b73c4d86 Mon Sep 17 00:00:00 2001 From: Edwin Ngoma Date: Wed, 30 Nov 2022 13:47:19 +0200 Subject: [PATCH 3/3] new postman link --- .../edwinNgoma/php_slim/API(s) collection & examples.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submissions/edwinNgoma/php_slim/API(s) collection & examples.txt b/submissions/edwinNgoma/php_slim/API(s) collection & examples.txt index 89ce899ed..ddab396ef 100644 --- a/submissions/edwinNgoma/php_slim/API(s) collection & examples.txt +++ b/submissions/edwinNgoma/php_slim/API(s) collection & examples.txt @@ -1 +1 @@ -https://www.getpostman.com/collections/42a9b1930e25546d77ed \ No newline at end of file +https://www.postman.com/skytechuniversal/workspace/edy-at-dufuna/collection/19239115-e62da646-2f4e-4835-98b4-7cd50af400b7?action=share&creator=19239115 \ No newline at end of file