From 29a1be5c81c37d01c0064ee7856c88414bfd6ea4 Mon Sep 17 00:00:00 2001 From: upendras-ltts Date: Tue, 21 Nov 2023 10:39:18 +0530 Subject: [PATCH 1/6] Added initial setup for PHP and statsig --- phptodo/composer.json | 10 +++++ phptodo/main.php | 73 ++++++++++++++++++++++++++++++++++ phptodo/src/todo.php | 25 ++++++++++++ phptodo/src/todorepository.php | 70 ++++++++++++++++++++++++++++++++ 4 files changed, 178 insertions(+) create mode 100644 phptodo/composer.json create mode 100644 phptodo/main.php create mode 100644 phptodo/src/todo.php create mode 100644 phptodo/src/todorepository.php diff --git a/phptodo/composer.json b/phptodo/composer.json new file mode 100644 index 0000000..88fc26d --- /dev/null +++ b/phptodo/composer.json @@ -0,0 +1,10 @@ +{ + "name": "statsig/phptodo", + "description": "A PHP todo project", + "type": "project", + "require": { + "doctrine/dbal": "^3.7", + "statsig/statsigsdk": "*", + "slim/slim": "^2.6" + } +} diff --git a/phptodo/main.php b/phptodo/main.php new file mode 100644 index 0000000..2823091 --- /dev/null +++ b/phptodo/main.php @@ -0,0 +1,73 @@ +statsig = new StatsigServer("secret-9lbe9aax4FWPyJiLrKfo8GAj1cXX2UUqoDBcG4B7rKW", $options); + $this->user = StatsigUser::withUserID("php_user"); + $this->user->setEmail("user_php@statsig.com"); + $this->user->setCountry("IN"); + + } + + public function run() { + // Main functionality of the application + $config = $this->statsig->getConfig($this->user, "warning_banner"); + // error_log("The value of variable is: " . $config); + print_r($config); + $jsonString = json_encode($config); + print_r($jsonString); + + + } + + public function getExperiment(){ + $todo_experiment = $this->statsig->getExperiment($this->user, "item_sorting"); + print_r($todo_experiment); + print_r($todo_experiment->getName()); + print_r($todo_experiment->getValue()); + + $jsonString = json_encode($todo_experiment); + print_r($jsonString); + + } + + public function logEvent(){ + $event = new StatsigEvent("TODO_CREATE"); + $event->setUser($this->user); + $event->setValue("TODO"); + $event->setMetadata(array("title" => "TODO_1")); + $this->statsig->logEvent($event); + } + + public function flush(){ + $this->statsig->flush(); + } +} + +$main = new Main(); +$main->run(); +$main->getExperiment(); +$main->logEvent(); +$main->flush(); + + +?> \ No newline at end of file diff --git a/phptodo/src/todo.php b/phptodo/src/todo.php new file mode 100644 index 0000000..6e6037c --- /dev/null +++ b/phptodo/src/todo.php @@ -0,0 +1,25 @@ +id = $id; + $this->task = $task; + $this->description = $description; + $this->completed = $completed; + $this->edited = $edited; + $this->serialNumber = $serialNumber; + $this->lastViewed = $lastViewed; + $this->createdDate = $createdDate; + $this->modifiedDate = $modifiedDate; + } +} +?> diff --git a/phptodo/src/todorepository.php b/phptodo/src/todorepository.php new file mode 100644 index 0000000..d0c7455 --- /dev/null +++ b/phptodo/src/todorepository.php @@ -0,0 +1,70 @@ +filePath = $filePath; + } + + public function getAllTodos() { + $todos = json_decode(file_get_contents($this->filePath), true); + return $todos; + } + + public function getTodoById($id) { + $todos = json_decode(file_get_contents($this->filePath), true); + foreach ($todos as $todo) { + if ($todo['id'] == $id) { + return $todo; + } + } + return null; + } + + public function createTodo($task, $description, $completed, $edited, $serialNumber, $lastViewed, $createdDate, $modifiedDate) { + $todos = json_decode(file_get_contents($this->filePath), true); + $newTodo = [ + 'id' => count($todos) + 1, + 'task' => $task, + 'description' => $description, + 'completed' => $completed, + 'edited' => $edited, + 'serialNumber' => $serialNumber, + 'lastViewed' => $lastViewed, + 'createdDate' => $createdDate, + 'modifiedDate' => $modifiedDate + ]; + $todos[] = $newTodo; + file_put_contents($this->filePath, json_encode($todos)); + } + + public function updateTodo($id, $task, $description, $completed, $edited, $serialNumber, $lastViewed, $createdDate, $modifiedDate) { + $todos = json_decode(file_get_contents($this->filePath), true); + foreach ($todos as &$todo) { + if ($todo['id'] == $id) { + $todo['task'] = $task; + $todo['description'] = $description; + $todo['completed'] = $completed; + $todo['edited'] = $edited; + $todo['serialNumber'] = $serialNumber; + $todo['lastViewed'] = $lastViewed; + $todo['createdDate'] = $createdDate; + $todo['modifiedDate'] = $modifiedDate; + break; + } + } + file_put_contents($this->filePath, json_encode($todos)); + } + + public function deleteTodo($id) { + $todos = json_decode(file_get_contents($this->filePath), true); + foreach ($todos as $key => $todo) { + if ($todo['id'] == $id) { + unset($todos[$key]); + break; + } + } + file_put_contents($this->filePath, json_encode(array_values($todos))); + } +} +?> From 2d389f08731e1bb95836bf79e7c175cd668d0e3d Mon Sep 17 00:00:00 2001 From: upendras-ltts Date: Tue, 28 Nov 2023 14:38:13 +0530 Subject: [PATCH 2/6] Todos api integration --- phptodo/app.php | 87 ++++++++++++++++++++++++++++++++++ phptodo/composer.json | 14 ++++-- phptodo/main.php | 73 ---------------------------- phptodo/src/TodoController.php | 74 +++++++++++++++++++++++++++++ phptodo/src/todorepository.php | 19 ++++++-- phptodo/src/todos.json | 0 phptodo/src/util.php | 81 +++++++++++++++++++++++++++++++ phptodo/todos.json | 1 + 8 files changed, 268 insertions(+), 81 deletions(-) create mode 100644 phptodo/app.php create mode 100644 phptodo/src/TodoController.php create mode 100644 phptodo/src/todos.json create mode 100644 phptodo/src/util.php create mode 100644 phptodo/todos.json diff --git a/phptodo/app.php b/phptodo/app.php new file mode 100644 index 0000000..4c180bf --- /dev/null +++ b/phptodo/app.php @@ -0,0 +1,87 @@ +addRoutingMiddleware(); + +// // Set the base path to run the app in a subdirectory. +// // This path is used in urlFor(). +// $app->add(new BasePathMiddleware($app)); + +// $app->addErrorMiddleware(true, true, true); + +// Create an instance of the TodoController +$repository = new TodoRepository(); +$todoController = new TodoController($repository); + +// Map the GET /todos endpoint to the getTodos method +$app->get('/todos', function (Request $request, Response $response, $args) use ($todoController) { + + $todos = $todoController->getAllTodos(); + print_r(json_encode($todos)); + + return $response->getBody()->write(json_encode($todos)); +}); + +// Map the GET /todos/{id} endpoint to the getTodoById method +$app->get('/todos/{id}', function (Request $request, Response $response, $args) use ($todoController) { + $id = $args['id']; + $todo = $todoController->getTodoById($id); + return $response->getBody()->write(json_encode($todo)); +}); + +// Map the POST /todos endpoint to the createTodo method +$app->post('/todos', function (Request $request, Response $response, $args) use ($todoController) { + // print_r(json_encode($request)); + error_log("Todo post called "); + $json_payload = json_decode($request->getBody()); + $log_message_temp = "JSON request data: " . print_r($json_payload, true); + error_log($log_message_temp); + + $data = $request->getBody(); + $log_message = "POST request data: " . print_r($data, true); + error_log($log_message); + $todo = $todoController->createTodo($data); + return $response->getBody()->write(json_encode($todo)); +}); + +// Map the PUT /todos/{id} endpoint to the updateTodoById method +$app->put('/todos/{id}', function (Request $request, Response $response, $args) use ($todoController) { + $id = $args['id']; + $data = $request->getParsedBody(); + $todo = $todoController->updateTodoById($id, $data); + return $response->getBody()->write(json_encode($todo)); +}); + +// Map the DELETE /todos/{id} endpoint to the deleteTodoById method +$app->delete('/todos/{id}', function (Request $request, Response $response, $args) use ($todoController) { + $id = $args['id']; + $todoController->deleteTodoById($id); + return $response->getBody()->write(json_encode(['id' => $id])); +}); + +// Run the Slim App +$app->run(); + +// try { +// $app->run(); +// } catch (Exception $e) { +// // We display a error message +// die( json_encode($e)); +// } + +?> \ No newline at end of file diff --git a/phptodo/composer.json b/phptodo/composer.json index 88fc26d..4386392 100644 --- a/phptodo/composer.json +++ b/phptodo/composer.json @@ -1,10 +1,18 @@ { "name": "statsig/phptodo", - "description": "A PHP todo project", + "description": "A PHP Todo project", "type": "project", "require": { + "statsig/statsigsdk": "^2.2", "doctrine/dbal": "^3.7", - "statsig/statsigsdk": "*", - "slim/slim": "^2.6" + "slim/slim": "4.*", + "psr/http-message": "^1.0", + "selective/basepath": "*" + + }, + "autoload": { + "psr-4": { + "Statsig\\Phptodo\\": "src/" + } } } diff --git a/phptodo/main.php b/phptodo/main.php index 2823091..e69de29 100644 --- a/phptodo/main.php +++ b/phptodo/main.php @@ -1,73 +0,0 @@ -statsig = new StatsigServer("secret-9lbe9aax4FWPyJiLrKfo8GAj1cXX2UUqoDBcG4B7rKW", $options); - $this->user = StatsigUser::withUserID("php_user"); - $this->user->setEmail("user_php@statsig.com"); - $this->user->setCountry("IN"); - - } - - public function run() { - // Main functionality of the application - $config = $this->statsig->getConfig($this->user, "warning_banner"); - // error_log("The value of variable is: " . $config); - print_r($config); - $jsonString = json_encode($config); - print_r($jsonString); - - - } - - public function getExperiment(){ - $todo_experiment = $this->statsig->getExperiment($this->user, "item_sorting"); - print_r($todo_experiment); - print_r($todo_experiment->getName()); - print_r($todo_experiment->getValue()); - - $jsonString = json_encode($todo_experiment); - print_r($jsonString); - - } - - public function logEvent(){ - $event = new StatsigEvent("TODO_CREATE"); - $event->setUser($this->user); - $event->setValue("TODO"); - $event->setMetadata(array("title" => "TODO_1")); - $this->statsig->logEvent($event); - } - - public function flush(){ - $this->statsig->flush(); - } -} - -$main = new Main(); -$main->run(); -$main->getExperiment(); -$main->logEvent(); -$main->flush(); - - -?> \ No newline at end of file diff --git a/phptodo/src/TodoController.php b/phptodo/src/TodoController.php new file mode 100644 index 0000000..d72e87d --- /dev/null +++ b/phptodo/src/TodoController.php @@ -0,0 +1,74 @@ +repository = $repository; + } + + public function getAllTodos() { + $todos = $this->repository->getAllTodos(); + $this->sendJsonResponse($todos); + } + + public function getTodoById($id) { + $todo = $this->repository->getTodoById($id); + if ($todo) { + $this->sendJsonResponse($todo); + } else { + $this->notFound(); + } + } + + public function createTodo() { + $input = $this->getJsonInput(); + $this->repository->createTodo( + $input['task'] ?? '', + $input['description'] ?? '', + $input['completed'] ?? false, + $input['edited'] ?? false, + $input['serialNumber'] ?? 0, + $input['lastViewed'] ?? '', + $input['createdDate'] ?? '', + $input['modifiedDate'] ?? '' + ); + $this->sendJsonResponse(['message' => 'Todo created']); + } + + public function updateTodoById($id) { + $input = $this->getJsonInput(); + $this->repository->updateTodo( + $id, + $input['task'] ?? '', + $input['description'] ?? '', + $input['completed'] ?? false, + $input['edited'] ?? false, + $input['serialNumber'] ?? 0, + $input['lastViewed'] ?? '', + $input['createdDate'] ?? '', + $input['modifiedDate'] ?? '' + ); + $this->sendJsonResponse(['message' => 'Todo updated']); + } + + public function deleteTodoById($id) { + $this->repository->deleteTodo($id); + $this->sendJsonResponse(['message' => 'Todo deleted']); + } + + public function sendJsonResponse($data) { + header('Content-Type: application/json'); + echo json_encode($data); + } + + public function getJsonInput() { + $input = file_get_contents('php://input'); + return json_decode($input, true) ?? []; + } + + public function notFound() { + header('HTTP/1.1 404 Not Found'); + echo '404 Not Found'; + } +} +?> diff --git a/phptodo/src/todorepository.php b/phptodo/src/todorepository.php index d0c7455..aba8548 100644 --- a/phptodo/src/todorepository.php +++ b/phptodo/src/todorepository.php @@ -1,9 +1,16 @@ filePath = $filePath; +class TodoRepository { + private $filePath = 'todos.json'; + + + public function __construct() { + if (!file_exists($this->filePath)) { + touch($this->filePath); + // Optionally, you can set file permissions using chmod() + // chmod($filePath, 0644); + } + } public function getAllTodos() { @@ -23,8 +30,10 @@ public function getTodoById($id) { public function createTodo($task, $description, $completed, $edited, $serialNumber, $lastViewed, $createdDate, $modifiedDate) { $todos = json_decode(file_get_contents($this->filePath), true); + $count = count($todos ?? []); + $newTodo = [ - 'id' => count($todos) + 1, + 'id' => $count + 1, 'task' => $task, 'description' => $description, 'completed' => $completed, diff --git a/phptodo/src/todos.json b/phptodo/src/todos.json new file mode 100644 index 0000000..e69de29 diff --git a/phptodo/src/util.php b/phptodo/src/util.php new file mode 100644 index 0000000..bce15e2 --- /dev/null +++ b/phptodo/src/util.php @@ -0,0 +1,81 @@ +statsig = new StatsigServer("secret-9lbe9aax4FWPyJiLrKfo8GAj1cXX2UUqoDBcG4B7rKW", $options); + $this->user = StatsigUser::withUserID("php_user"); + $this->user->setEmail("user_php@statsig.com"); + $this->user->setCountry("IN"); + + } + + public function run() { + // Main functionality of the application + $config = $this->statsig->getConfig($this->user, "warning_banner"); + // error_log("The value of variable is: " . $config); + print_r($config); + $jsonString = json_encode($config); + print_r($jsonString); + + $repository = new TodoRepository(); + $this->todo_controller = new TodoController($repository); + // $this->todo_controller->handleRequest(); + + } + + public function getExperiment(){ + $todo_experiment = $this->statsig->getExperiment($this->user, "item_sorting"); + print_r($todo_experiment); + print_r($todo_experiment->getName()); + print_r($todo_experiment->getValue()); + + $jsonString = json_encode($todo_experiment); + print_r($jsonString); + + } + + public function logEvent(){ + $event = new StatsigEvent("TODO_CREATE"); + $event->setUser($this->user); + $event->setValue("TODO"); + $event->setMetadata(array("title" => "TODO_1")); + $this->statsig->logEvent($event); + } + + public function flush(){ + $this->statsig->flush(); + } +} + +$main = new Main(); +$main->run(); +$main->getExperiment(); +$main->logEvent(); +$main->flush(); + +phpinfo() + + +?> \ No newline at end of file diff --git a/phptodo/todos.json b/phptodo/todos.json new file mode 100644 index 0000000..529c6a7 --- /dev/null +++ b/phptodo/todos.json @@ -0,0 +1 @@ +[{"id":1,"task":"task9","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":2,"task":"task9","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":3,"task":"task9","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"}] \ No newline at end of file From 01dcb30d6ec1fe324e52daeb3ac9ae32dd9c9b61 Mon Sep 17 00:00:00 2001 From: upendras-ltts Date: Wed, 29 Nov 2023 10:46:25 +0530 Subject: [PATCH 3/6] Minor fix related to status code --- phptodo/app.php | 82 ++++++++++++++-------------------- phptodo/composer.json | 1 + phptodo/src/TodoController.php | 52 ++++++++++++--------- phptodo/src/todo.php | 7 +-- phptodo/src/todorepository.php | 32 ++++++++----- phptodo/src/util.php | 34 +++++++------- phptodo/todos.json | 2 +- 7 files changed, 107 insertions(+), 103 deletions(-) diff --git a/phptodo/app.php b/phptodo/app.php index 4c180bf..1c177e4 100644 --- a/phptodo/app.php +++ b/phptodo/app.php @@ -1,87 +1,71 @@ -addRoutingMiddleware(); - -// // Set the base path to run the app in a subdirectory. -// // This path is used in urlFor(). -// $app->add(new BasePathMiddleware($app)); - -// $app->addErrorMiddleware(true, true, true); - -// Create an instance of the TodoController $repository = new TodoRepository(); $todoController = new TodoController($repository); -// Map the GET /todos endpoint to the getTodos method +$app->add(new CorsMiddleware( + [ + "origin" => ["*"], + "methods" => ["GET", "POST", "PUT", "PATCH", "DELETE"], + "headers.allow" => ["Authorization", "Content-Type"], + "headers.expose" => [], + "credentials" => true, + "cache" => 0 + ] +)); + $app->get('/todos', function (Request $request, Response $response, $args) use ($todoController) { $todos = $todoController->getAllTodos(); - print_r(json_encode($todos)); - - return $response->getBody()->write(json_encode($todos)); + $response->getBody()->write(json_encode($todos)); + $response = $response->withStatus(200, 'OK'); + return $response; }); // Map the GET /todos/{id} endpoint to the getTodoById method $app->get('/todos/{id}', function (Request $request, Response $response, $args) use ($todoController) { $id = $args['id']; $todo = $todoController->getTodoById($id); - return $response->getBody()->write(json_encode($todo)); + $response->getBody()->write(json_encode($todo)); + $response = $response->withStatus(200, 'OK'); + return $response; }); // Map the POST /todos endpoint to the createTodo method $app->post('/todos', function (Request $request, Response $response, $args) use ($todoController) { - // print_r(json_encode($request)); - error_log("Todo post called "); - $json_payload = json_decode($request->getBody()); - $log_message_temp = "JSON request data: " . print_r($json_payload, true); - error_log($log_message_temp); $data = $request->getBody(); - $log_message = "POST request data: " . print_r($data, true); - error_log($log_message); $todo = $todoController->createTodo($data); - return $response->getBody()->write(json_encode($todo)); + $response->getBody()->write(json_encode($todo)); + $response = $response->withStatus(200, 'OK'); + return $response->withHeader('Content-Type', 'application/json'); }); // Map the PUT /todos/{id} endpoint to the updateTodoById method -$app->put('/todos/{id}', function (Request $request, Response $response, $args) use ($todoController) { - $id = $args['id']; - $data = $request->getParsedBody(); - $todo = $todoController->updateTodoById($id, $data); - return $response->getBody()->write(json_encode($todo)); +$app->put('/todos', function (Request $request, Response $response, $args) use ($todoController) { + $data = $request->getBody(); + $todo = $todoController->updateTodoById($data); + $response->getBody()->write(json_encode($todo)); + $response = $response->withStatus(201, 'OK'); + return $response; }); // Map the DELETE /todos/{id} endpoint to the deleteTodoById method $app->delete('/todos/{id}', function (Request $request, Response $response, $args) use ($todoController) { $id = $args['id']; $todoController->deleteTodoById($id); - return $response->getBody()->write(json_encode(['id' => $id])); + $response->getBody()->write(json_encode(['id' => $id])); + $response = $response->withStatus(200, 'OK'); + return $response; }); -// Run the Slim App $app->run(); - -// try { -// $app->run(); -// } catch (Exception $e) { -// // We display a error message -// die( json_encode($e)); -// } - -?> \ No newline at end of file diff --git a/phptodo/composer.json b/phptodo/composer.json index 4386392..cea1757 100644 --- a/phptodo/composer.json +++ b/phptodo/composer.json @@ -6,6 +6,7 @@ "statsig/statsigsdk": "^2.2", "doctrine/dbal": "^3.7", "slim/slim": "4.*", + "tuupola/cors-middleware": "*", "psr/http-message": "^1.0", "selective/basepath": "*" diff --git a/phptodo/src/TodoController.php b/phptodo/src/TodoController.php index d72e87d..913a2c9 100644 --- a/phptodo/src/TodoController.php +++ b/phptodo/src/TodoController.php @@ -1,28 +1,32 @@ repository = $repository; } - public function getAllTodos() { + public function getAllTodos() + { $todos = $this->repository->getAllTodos(); - $this->sendJsonResponse($todos); + return $todos; } - public function getTodoById($id) { + public function getTodoById($id) + { $todo = $this->repository->getTodoById($id); if ($todo) { - $this->sendJsonResponse($todo); - } else { - $this->notFound(); + return $todo; } + return $this->notFound(); } - public function createTodo() { + public function createTodo() + { $input = $this->getJsonInput(); - $this->repository->createTodo( + $todo = $this->repository->createTodo( $input['task'] ?? '', $input['description'] ?? '', $input['completed'] ?? false, @@ -32,13 +36,14 @@ public function createTodo() { $input['createdDate'] ?? '', $input['modifiedDate'] ?? '' ); - $this->sendJsonResponse(['message' => 'Todo created']); + return $todo; } - public function updateTodoById($id) { + public function updateTodoById() + { $input = $this->getJsonInput(); - $this->repository->updateTodo( - $id, + $todo = $this->repository->updateTodo( + $input['id'] ?? 0, $input['task'] ?? '', $input['description'] ?? '', $input['completed'] ?? false, @@ -48,27 +53,30 @@ public function updateTodoById($id) { $input['createdDate'] ?? '', $input['modifiedDate'] ?? '' ); - $this->sendJsonResponse(['message' => 'Todo updated']); + return $todo; } - public function deleteTodoById($id) { + public function deleteTodoById($id) + { $this->repository->deleteTodo($id); - $this->sendJsonResponse(['message' => 'Todo deleted']); + return ['id' => $id]; } - public function sendJsonResponse($data) { + public function sendJsonResponse($data) + { header('Content-Type: application/json'); - echo json_encode($data); + return json_encode($data); } - public function getJsonInput() { + public function getJsonInput() + { $input = file_get_contents('php://input'); return json_decode($input, true) ?? []; } - public function notFound() { + public function notFound() + { header('HTTP/1.1 404 Not Found'); echo '404 Not Found'; } } -?> diff --git a/phptodo/src/todo.php b/phptodo/src/todo.php index 6e6037c..9ce390a 100644 --- a/phptodo/src/todo.php +++ b/phptodo/src/todo.php @@ -1,5 +1,6 @@ id = $id; $this->task = $task; $this->description = $description; @@ -22,4 +24,3 @@ public function __construct($id, $task, $description, $completed, $edited, $seri $this->modifiedDate = $modifiedDate; } } -?> diff --git a/phptodo/src/todorepository.php b/phptodo/src/todorepository.php index aba8548..ac9ce86 100644 --- a/phptodo/src/todorepository.php +++ b/phptodo/src/todorepository.php @@ -1,24 +1,25 @@ filePath)) { touch($this->filePath); - // Optionally, you can set file permissions using chmod() - // chmod($filePath, 0644); } - } - public function getAllTodos() { + public function getAllTodos() + { $todos = json_decode(file_get_contents($this->filePath), true); return $todos; } - public function getTodoById($id) { + public function getTodoById($id) + { $todos = json_decode(file_get_contents($this->filePath), true); foreach ($todos as $todo) { if ($todo['id'] == $id) { @@ -28,10 +29,11 @@ public function getTodoById($id) { return null; } - public function createTodo($task, $description, $completed, $edited, $serialNumber, $lastViewed, $createdDate, $modifiedDate) { + public function createTodo($task, $description, $completed, $edited, $serialNumber, $lastViewed, $createdDate, $modifiedDate) + { $todos = json_decode(file_get_contents($this->filePath), true); $count = count($todos ?? []); - + $newTodo = [ 'id' => $count + 1, 'task' => $task, @@ -45,10 +47,14 @@ public function createTodo($task, $description, $completed, $edited, $serialNumb ]; $todos[] = $newTodo; file_put_contents($this->filePath, json_encode($todos)); + return $newTodo; } - public function updateTodo($id, $task, $description, $completed, $edited, $serialNumber, $lastViewed, $createdDate, $modifiedDate) { + public function updateTodo($id, $task, $description, $completed, $edited, $serialNumber, $lastViewed, $createdDate, $modifiedDate) + { $todos = json_decode(file_get_contents($this->filePath), true); + $tempTodo = null; + error_log($id); foreach ($todos as &$todo) { if ($todo['id'] == $id) { $todo['task'] = $task; @@ -59,13 +65,16 @@ public function updateTodo($id, $task, $description, $completed, $edited, $seria $todo['lastViewed'] = $lastViewed; $todo['createdDate'] = $createdDate; $todo['modifiedDate'] = $modifiedDate; + $tempTodo = $todo; break; } } file_put_contents($this->filePath, json_encode($todos)); + return $tempTodo; } - public function deleteTodo($id) { + public function deleteTodo($id) + { $todos = json_decode(file_get_contents($this->filePath), true); foreach ($todos as $key => $todo) { if ($todo['id'] == $id) { @@ -76,4 +85,3 @@ public function deleteTodo($id) { file_put_contents($this->filePath, json_encode(array_values($todos))); } } -?> diff --git a/phptodo/src/util.php b/phptodo/src/util.php index bce15e2..c762271 100644 --- a/phptodo/src/util.php +++ b/phptodo/src/util.php @@ -1,8 +1,8 @@ user = StatsigUser::withUserID("php_user"); $this->user->setEmail("user_php@statsig.com"); $this->user->setCountry("IN"); - } - public function run() { + public function run() + { // Main functionality of the application $config = $this->statsig->getConfig($this->user, "warning_banner"); - // error_log("The value of variable is: " . $config); + // error_log("The value of variable is: " . $config); print_r($config); $jsonString = json_encode($config); print_r($jsonString); - + $repository = new TodoRepository(); $this->todo_controller = new TodoController($repository); - // $this->todo_controller->handleRequest(); + // $this->todo_controller->handleRequest(); } - public function getExperiment(){ + public function getExperiment() + { $todo_experiment = $this->statsig->getExperiment($this->user, "item_sorting"); print_r($todo_experiment); print_r($todo_experiment->getName()); @@ -53,10 +56,10 @@ public function getExperiment(){ $jsonString = json_encode($todo_experiment); print_r($jsonString); - } - public function logEvent(){ + public function logEvent() + { $event = new StatsigEvent("TODO_CREATE"); $event->setUser($this->user); $event->setValue("TODO"); @@ -64,7 +67,8 @@ public function logEvent(){ $this->statsig->logEvent($event); } - public function flush(){ + public function flush() + { $this->statsig->flush(); } } @@ -76,6 +80,4 @@ public function flush(){ $main->flush(); phpinfo() - - ?> \ No newline at end of file diff --git a/phptodo/todos.json b/phptodo/todos.json index 529c6a7..8dc3c09 100644 --- a/phptodo/todos.json +++ b/phptodo/todos.json @@ -1 +1 @@ -[{"id":1,"task":"task9","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":2,"task":"task9","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":3,"task":"task9","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"}] \ No newline at end of file +[{"id":1,"task":"task2_Edited_2","description":"","completed":true,"edited":true,"serialNumber":2,"lastViewed":true,"createdDate":"2023-10-10T15:05:15.486Z","modifiedDate":"2023-10-10T20:36:13.596Z"},{"id":2,"task":"task9","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":4,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":5,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":6,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":7,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":8,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":9,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":10,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":11,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":12,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":13,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":14,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":15,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":16,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":17,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":18,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":19,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":20,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":21,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":22,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":23,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":24,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":25,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":26,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":27,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"}] \ No newline at end of file From 1cfd7d610762b53ec4b3c81718b930dbba774c5d Mon Sep 17 00:00:00 2001 From: upendras-ltts Date: Wed, 29 Nov 2023 10:59:48 +0530 Subject: [PATCH 4/6] minor change --- phptodo/src/util.php | 1 + phptodo/todos.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/phptodo/src/util.php b/phptodo/src/util.php index c762271..0c72232 100644 --- a/phptodo/src/util.php +++ b/phptodo/src/util.php @@ -1,4 +1,5 @@ Date: Thu, 30 Nov 2023 20:59:36 +0530 Subject: [PATCH 5/6] Added Readme file --- phptodo/TodoApp.php | 93 +++++++++++++++++++ phptodo/{src/util.php => Util.php} | 25 +---- phptodo/app.php | 71 -------------- phptodo/readme.md | 144 +++++++++++++++++++++++++++++ phptodo/todos.json | 1 - 5 files changed, 239 insertions(+), 95 deletions(-) create mode 100644 phptodo/TodoApp.php rename phptodo/{src/util.php => Util.php} (71%) delete mode 100644 phptodo/app.php create mode 100644 phptodo/readme.md diff --git a/phptodo/TodoApp.php b/phptodo/TodoApp.php new file mode 100644 index 0000000..9a7c95d --- /dev/null +++ b/phptodo/TodoApp.php @@ -0,0 +1,93 @@ +app = AppFactory::create(); + $this->util = new Util(); + + $repository = new TodoRepository(); + $todoController = new TodoController($repository); + + $this->app->add(new CorsMiddleware( + [ + "origin" => ["*"], + "methods" => ["GET", "POST", "PUT", "PATCH", "DELETE"], + "headers.allow" => ["Authorization", "Content-Type"], + "headers.expose" => [], + "credentials" => true, + "cache" => 0 + ] + )); + + $this->app->get('/todos', function (Request $request, Response $response, $args) use ($todoController) { + + $todos = $todoController->getAllTodos(); + $response->getBody()->write(json_encode($todos)); + $response = $response->withStatus(200, 'OK'); + return $response; + }); + + // Map the GET /todos/{id} endpoint to the getTodoById method + $this->app->get('/todos/{id}', function (Request $request, Response $response, $args) use ($todoController) { + $id = $args['id']; + $todo = $todoController->getTodoById($id); + $response->getBody()->write(json_encode($todo)); + $response = $response->withStatus(200, 'OK'); + return $response; + }); + + // Map the POST /todos endpoint to the createTodo method + $this->app->post('/todos', function (Request $request, Response $response, $args) use ($todoController) { + + $data = $request->getBody(); + $todo = $todoController->createTodo($data); + $response->getBody()->write(json_encode($todo)); + $response = $response->withStatus(200, 'OK'); + return $response->withHeader('Content-Type', 'application/json'); + }); + + // Map the PUT /todos/{id} endpoint to the updateTodoById method + $this->app->put('/todos', function (Request $request, Response $response, $args) use ($todoController) { + $data = $request->getBody(); + $todo = $todoController->updateTodoById($data); + $response->getBody()->write(json_encode($todo)); + $response = $response->withStatus(201, 'OK'); + return $response; + }); + + // Map the DELETE /todos/{id} endpoint to the deleteTodoById method + $this->app->delete('/todos/{id}', function (Request $request, Response $response, $args) use ($todoController) { + $id = $args['id']; + $todoController->deleteTodoById($id); + $response->getBody()->write(json_encode(['id' => $id])); + $response = $response->withStatus(200, 'OK'); + return $response; + }); + } + + public function run() + { + $this->app->run(); + $this->util->logEvent(); + } +} + +$todoApp = new TodoApp(); + +// Run the application +$todoApp->run(); diff --git a/phptodo/src/util.php b/phptodo/Util.php similarity index 71% rename from phptodo/src/util.php rename to phptodo/Util.php index 0c72232..34c956a 100644 --- a/phptodo/src/util.php +++ b/phptodo/Util.php @@ -1,9 +1,7 @@ statsig->getConfig($this->user, "warning_banner"); - // error_log("The value of variable is: " . $config); print_r($config); $jsonString = json_encode($config); print_r($jsonString); - - $repository = new TodoRepository(); - $this->todo_controller = new TodoController($repository); - // $this->todo_controller->handleRequest(); - } public function getExperiment() @@ -74,11 +60,4 @@ public function flush() } } -$main = new Main(); -$main->run(); -$main->getExperiment(); -$main->logEvent(); -$main->flush(); - -phpinfo() ?> \ No newline at end of file diff --git a/phptodo/app.php b/phptodo/app.php deleted file mode 100644 index 1c177e4..0000000 --- a/phptodo/app.php +++ /dev/null @@ -1,71 +0,0 @@ -add(new CorsMiddleware( - [ - "origin" => ["*"], - "methods" => ["GET", "POST", "PUT", "PATCH", "DELETE"], - "headers.allow" => ["Authorization", "Content-Type"], - "headers.expose" => [], - "credentials" => true, - "cache" => 0 - ] -)); - -$app->get('/todos', function (Request $request, Response $response, $args) use ($todoController) { - - $todos = $todoController->getAllTodos(); - $response->getBody()->write(json_encode($todos)); - $response = $response->withStatus(200, 'OK'); - return $response; -}); - -// Map the GET /todos/{id} endpoint to the getTodoById method -$app->get('/todos/{id}', function (Request $request, Response $response, $args) use ($todoController) { - $id = $args['id']; - $todo = $todoController->getTodoById($id); - $response->getBody()->write(json_encode($todo)); - $response = $response->withStatus(200, 'OK'); - return $response; -}); - -// Map the POST /todos endpoint to the createTodo method -$app->post('/todos', function (Request $request, Response $response, $args) use ($todoController) { - - $data = $request->getBody(); - $todo = $todoController->createTodo($data); - $response->getBody()->write(json_encode($todo)); - $response = $response->withStatus(200, 'OK'); - return $response->withHeader('Content-Type', 'application/json'); -}); - -// Map the PUT /todos/{id} endpoint to the updateTodoById method -$app->put('/todos', function (Request $request, Response $response, $args) use ($todoController) { - $data = $request->getBody(); - $todo = $todoController->updateTodoById($data); - $response->getBody()->write(json_encode($todo)); - $response = $response->withStatus(201, 'OK'); - return $response; -}); - -// Map the DELETE /todos/{id} endpoint to the deleteTodoById method -$app->delete('/todos/{id}', function (Request $request, Response $response, $args) use ($todoController) { - $id = $args['id']; - $todoController->deleteTodoById($id); - $response->getBody()->write(json_encode(['id' => $id])); - $response = $response->withStatus(200, 'OK'); - return $response; -}); - -$app->run(); diff --git a/phptodo/readme.md b/phptodo/readme.md new file mode 100644 index 0000000..58a3952 --- /dev/null +++ b/phptodo/readme.md @@ -0,0 +1,144 @@ +#### TODO project in PHP + +##### PHP version + +```PHP 8.2.12 (cli) (``` + +##### Run the project +Navigate till TodoApp.php file in project and execute command + +```php -S localhost:8080 .\TodoApp.php ``` + +### API Structure + +The Todo App CRUD API is a set of endpoints that allow users to perform CRUD (Create, Read, Update, Delete) operations on todo items in the Todo App. + +The API includes the following endpoints: + +- `GET /todos`: Retrieves a list of all todo items. +- `GET /todos/{id}`: Retrieves a specific todo item by its ID. +- `POST /todos`: Creates a new todo item. +- `PUT /todos`: Updates an existing todo item. +- `DELETE /todos/{id}`: Deletes a todo item. + +Each endpoint accepts and returns JSON data. + +Sample CURL requests with responses for the Todo App CRUD API: + +1. Retrieve a list of all todo items: + + ```bash + curl -s http://localhost:8080/todos + ``` + + Response: + + ```json + [ + { + "id": 1, + "task": "task1", + "description": "", + "completed": false, + "edited": false, + "lastViewed": false, + "serialNumber": 1, + "createdDate": "2023-10-18T07:12:31.830Z", + "modifiedDate": "2023-10-18T07:12:31.830Z" + }, + { + "id": 2, + "task": "task2", + "description": "", + "completed": false, + "edited": false, + "lastViewed": false, + "serialNumber": 2, + "createdDate": "2023-10-18T07:12:34.746Z", + "modifiedDate": "2023-10-18T07:12:34.746Z" + }, + .... +] + ``` + +2. Retrieve a specific todo item by its ID: + + ```bash + curl -s http://localhost:8080/todos/{id} + ``` + + Response: + + ```json + { + "id": 1, + "task": "task1", + "description": "", + "completed": false, + "edited": false, + "lastViewed": false, + "serialNumber": 1, + "createdDate": "2023-10-18T07:12:31.830Z", + "modifiedDate": "2023-10-18T07:12:31.830Z" + } + ``` + +3. Create a new todo item: + + ```bash + curl -s POST -H "Content-Type: application/json" -d '{"serialNumber": 10,"task": "task9","completed": false,"description": "","edited": false,"createdDate": "2023-10-06T10:41:11.806Z","modifiedDate": "2023-10-06T10:41:11.806Z","lastViewed": false}' http://localhost:8080/todos + ``` + + Response: + + ```json + { + "id": 7, + "task": "task9", + "description": "", + "completed": 0, + "edited": 0, + "serialNumber": 10, + "lastViewed": 0, + "createdDate": "2023-10-06T10:41:11.806Z", + "modifiedDate": "2023-10-06T10:41:11.806Z" +} + ``` + +4. Update an existing todo item: + + ```bash + curl -s PUT -H "Content-Type: application/json" -d '{"serialNumber": 10,"task": "task9","completed": false,"description": "","edited": true,"createdDate": "2023-10-06T10:41:11.806Z","modifiedDate": "2023-10-06T10:41:11.806Z","lastViewed": true, "id":7}' http://localhost:8080/todos + ``` + + Response: + + ```json + { + "serialNumber": 10, + "task": "task9", + "completed": false, + "description": "", + "edited": true, + "createdDate": "2023-10-06T10:41:11.806Z", + "modifiedDate": "2023-10-06T10:41:11.806Z", + "lastViewed": true, + "id": 7 +} + ``` + +5. Delete a todo item: + + ```bash + curl -X DELETE http://localhost:8080/todos/{id} + ``` + + Response: + + ```json + { + "id": "7" + } + ``` + + diff --git a/phptodo/todos.json b/phptodo/todos.json index cc8fe7c..e69de29 100644 --- a/phptodo/todos.json +++ b/phptodo/todos.json @@ -1 +0,0 @@ -[{"id":18,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":19,"task":"task3_Edited","description":"","completed":true,"edited":true,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-11-29T05:26:02.401Z"},{"id":20,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":22,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":24,"task":"task3","description":"","completed":true,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"}] \ No newline at end of file From 16d0022c8c3efbb09e8c2ab7f177bc5bd5c59791 Mon Sep 17 00:00:00 2001 From: upendras-ltts Date: Thu, 30 Nov 2023 21:58:38 +0530 Subject: [PATCH 6/6] minor change --- phptodo/main.php | 0 phptodo/todos.json | 1 + 2 files changed, 1 insertion(+) delete mode 100644 phptodo/main.php diff --git a/phptodo/main.php b/phptodo/main.php deleted file mode 100644 index e69de29..0000000 diff --git a/phptodo/todos.json b/phptodo/todos.json index e69de29..a42e8d7 100644 --- a/phptodo/todos.json +++ b/phptodo/todos.json @@ -0,0 +1 @@ +[{"id":4,"task":"task4","description":"","completed":false,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"},{"id":3,"task":"task5","description":"","completed":false,"edited":false,"serialNumber":10,"lastViewed":false,"createdDate":"2023-10-06T10:41:11.806Z","modifiedDate":"2023-10-06T10:41:11.806Z"}] \ No newline at end of file