************* *** Intro *** ************* PHP/Laravel: To implement this assignment I used the Laravel php framework because it offers o lot of things out of the box and because I'm familiar with it. The requirements of the project was not something complicated so also It could be done in pure object oriented PHP. MVC: Laravel is based on the MVC architectural pattern so I sticked to it, without the 'V'-View part since we are talking about a headless CMS. DataBase/Session: Since you didn't requested a DataBase and also to make the project work for you out-of-the-box without the need of a Database setUp I chose to store the BlogApp objects in the 'Session'. My other choice if again I didn't want to use a database would be to store things in .json files but the use of Files is usually my last option. In general in every descend project it is always better to use a database and also I have to note that with the objects stored in the Database, Laravel with the use of 'Eloquent' offers us many very interesting and helpful features like migration, database seeding, object relations, interesting queries, etc But in this case since the BlogAPI is more an MVP I'm using Session. REST: All Blog functionality (BlogAPI) is working with REST requests simply by hitting different URLs and passing variables where needed as URL vars To all the requests I use the 'GET' http-verb because I like to be able to test/use the REST API out of the box, throw a Browser, throw Ajax or any other way just by hitting URLs and without having to Post Forms. If we where talking for a more robust and stable project I would have use forms so also other http-verbs like POST. ****************************************** *** Instructions to deploy the project *** ****************************************** Here you will find the simple steps needed to deploy and test my project. Note that to deploy you will need GIT and Composer 1) first of all clone the project go to the directory you want to clone the project and run: "git clone https://github.com/arischmod/h1.git" 2) "cd" into the new 'h1' folder and install the needed packages with composer run: "composer update" (this will take some time) 3) Change permissions of public folders "sudo chmod -R 775 storage" "sudo chmod -R 775 bootstrap/cache" 4) Copy the file '.env' that I sent attached to your email, under the 'h1' folder -> (../h1/.env) This file contains sensitive information used like passwords or email credentials so the best practice is not to have it public on the Internet so it is added in the .gitignore file 5) Deploy the project using php artisan pseudo server so you don't have to set up a new Apache or Nginx instance Go under the 'h1' git folder and run: "php artisan serve" (don't close this terminal window as log as you want the server to be up and running) 6) Now our project is Up and running You can test this by visiting the location: "http://127.0.0.1:8000/" in your browser. and you should see the Laravel starting page 7) Emails !!! During the creation of a new Blog an Email is Sent to the Admin as requested To be able to test I added "rik@h1.nl" as admin email (this is declared in the .env file) but mailGun service which I use to send email and for the email part to work out of the box you should: Agree That you allow to receive email from MailGun Servers! You can do this by accepting the invitation I sent you throw MailGun service. If you haven't received it or you already deleted it inform me so I send it again. Thanx ****************************************** *** How to USE the BlogAPI / CheatShit *** ****************************************** Init App: http://localhost:8000/blogapi/init (adds dummy data - some initial Blogs) Create New Blog: http://localhost:8000/blogapi/create/newTitle/someone/blablabla/true?sports&fashion Update Blog: http://localhost:8000/blogapi/update/3/aaa/bbb/ccc/true?sports Delete Blog: http://localhost:8000/blogapi/delete/1 Retrieve All Blogs http://localhost:8000/blogapi/blogs/desc http://localhost:8000/blogapi/blogs/asc/pub http://localhost:8000/blogapi/blogs/desc/pub?sports&fashion ******************************************************* *** Development Information / Testing Instructions *** ******************************************************* In the code you will find many comments that indicate which line of code is doing what. Also to the Browser you will use to test I hope you have a json beautifier plugIn so the json results from BlogAPI are in readable form. A Laravel project folder tree can be a little chaotic by the first look so I note out that the files that interest us and contain my code. Important project Files: /h1/routes/web.php // our Route file - contains all BlogAPI URLs /h1/app/Http/Controllers/BlogController.php // our Controller - contains all methods and logic /h1/app/Blog.php // our Model file - contains the Model (php Object declaration) All the available BlogAPI URLs are declared in the routes/web.php file and there it is declared to which method of the Controller we are redirected to each time **Init** First URL that we need to run is: "http://localhost:8000/blogapi/init" This initializes the APP (clears previous Session) and ads some fist dummy data in the project **Create new Blog** We can now start creating new Blogs with the command 'create' "http://localhost:8000/blogapi/create/'title'/'author'/'content'/published?tag1&tag2&tag3" - the 'title','author','content' are mandatory - the 'published' takes True or False values and it can be empty (by default is false) example: "http://localhost:8000/blogapi/create/newTitle/someone/blablabla/true?sports&fashion" **Update Blog** We can update a Blogs values with the command 'update' and the blogId "http://localhost:8000/blogapi/update/blogId/'title'/'author'/'content'/published?tag1&tag2&tag3" - the 'title','author','content' are mandatory - the 'published' takes True or False values and it can be empty (by default is false) example: "http://localhost:8000/blogapi/update/3/aaa/bbb/ccc/true?sports" **Delete Blog** We can delete a Blogs using it ID "http://localhost:8000/blogapi/delete/blogId" example: "http://localhost:8000/blogapi/delete/2" **Retrieve All Blogs** This method we use to retrieve all the existing Blog posts as an array of json objects By default this will return all the Blogs, published and unpublished, shorted by ascending order of publication Date URL: "http://localhost:8000/blogapi/blogs/order/publicationStatus?tag1&tag2" We can apply different filters on this - to get the blogs in ASC/DESC order - to get only the published ones - to get only the ones associated with a Tag example: "http://localhost:8000/blogapi/blogs" will return all the blogs, first the published ones and at the end the unpublished ones (default) example: "http://localhost:8000/blogapi/blogs/asc" will return all the blogs, first the published ones and at the end the unpublished ones the published ones will be in ascending order based on the publication Date example: "http://localhost:8000/blogapi/blogs/desc" will return all the blogs, first the published ones and at the end the unpublished ones the published ones will be in DESCENDING order based on the publication Date example: "http://localhost:8000/blogapi/blogs/asc/pub" will return ONLY the published blogs in ascending order example: "http://localhost:8000/blogapi/blogs/desc/pub" will return ONLY the published blogs in descending order example: "http://localhost:8000/blogapi/blogs?sports&fashion" will return ONLY the Blogs that are associated with the tags 'sports' or 'fashion' example: "http://localhost:8000/blogapi/blogs/desc/pub?sports&fashion" will return ONLY the Blogs that are associated with the tags 'sports' or 'fashion' also only the published blogs in descending order