A simple CRUD API example with Laravel, with Authentication. The idea was to use the basic features of the Laravel framework, like Sanctum for authentication, and Eloquent for the many-to-many relationship. For the sake of simplicity, every time you consult the API, it already brings the related domain (In this case, Books and Stores).
I thought in adding a "Active" verification in the Stores model, but I ran out of time. I've been working a lot recently.
After cloning the project, run the following commands:
docker-compose build
docker-compose up -d
docker exec app php artisan migrate
After running those commands, you should have a container running the application and another one running mysql database, and a Nginx server. You can test by running:
After running the docker-compose, and running the migration, just send a post request to: (you can use postman or insomnia)
http://localhost:8989/api/register
And then, post the following body as the example:
{
"name": "Marcos R.",
"email": "test@gmail.com",
"password": "12345678"
}
Expect the following response: (with a diferent token)
{
"access_token": "1|7WQJL7ud9k67uV82ybgzNOvwwbSO4O0yHIqprpxQ",
"token_type": "Bearer"
}
Once you register, automatically the API logins you in. You will use the access_token to connect to the api and use the CRUD features.
If you're using Postman or Insomnia, add Accept application/json header in order to work, and the bearer token.
POST to http://localhost:8989/api/login
{
"email": "test@gmail.com",
"password": "12345678"
}
POST to http://localhost:8989/api/logout
- Need to add the bearer token
List: GET to http://localhost:8989/api/store/
Create: POST to http://localhost:8989/api/store
{
"name":"Book Store",
"address": "Adress line 2",
"active": 1
}
Update: PUT to http://localhost:8989/api/store/{id}
{
"name":"Book Store",
"address": "Adress line 2",
"active": 1
}
Delete: DELETE to http://localhost:8989/api/store/{id}
List: GET to http://localhost:8989/api/book/
Create: POST to http://localhost:8989/api/book
{
"name":"Voyage to the center of the Earth",
"ISBN": 111111111,
"value": 10.5,
"store_id": 1
}
Update: PUT to http://localhost:8989/api/book/{id}
{
"name":"Voyage to the center of the Earth",
"ISBN": 111111111,
"value": 10.5,
"store_id": 1
}
Delete: DELETE to http://localhost:8989/api/book/{id}
- Remember to add the bearer token in all api calls.
You can expect something like this when getting a response for a store listing:
[
{
"id": 1,
"name": "Book Store",
"address": "Adress line 2",
"active": 1,
"created_at": "2024-04-09T22:34:28.000000Z",
"updated_at": "2024-04-09T22:34:28.000000Z",
"books": [
{
"id": 1,
"name": "Les Miserables",
"ISBN": 111111111,
"value": "13.50",
"created_at": "2024-04-09T22:34:52.000000Z",
"updated_at": "2024-04-09T22:34:52.000000Z",
"pivot": {
"store_id": 1,
"book_id": 1
}
},
{
"id": 2,
"name": "Voyage to the center of the Earth",
"ISBN": 111111111,
"value": "10.50",
"created_at": "2024-04-09T22:35:01.000000Z",
"updated_at": "2024-04-09T22:53:20.000000Z",
"pivot": {
"store_id": 1,
"book_id": 2
}
}
]
}
]