Skip to content

jedi4z/minesweeper-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Minesweeper-API

This is API rest written in GO that allows you to play the classic game Minesweeper

Top level project structure

  • app/adapter: this is the interface between your application and outside data service, for example another Rest or gRPC service. All the data conversion and transformation happened here, so your business logic code doesn’t need to be aware of the detail implementation (whether it gRPC or REST) of outside services.
  • app/container: the dependency injection container, which is responsible for creating concrete types and injecting them into each function.
  • app/models: domain module layer, which has domain structs. All other layers depend on them and they don’t depend on any other layers.
  • app/repositories: persistence layer, which is responsible for retrieving and modifying data for the domain model. It only depends on the model layer.
  • app/usecases: This is an important layer and the entry point of business logic. Each business feature is implemented by a use case. It is the top level layer, so no other layer depends on it ( except “cmd”), but it depends on other layers.
  • cmd: the command. All different types of “main.go” are here and you can have multiple ones. This is the starting point of the application.

How to run the project

# Start the service
make run

# Build and start service using docker-compose
make up

# Delete docker containers
make down

As an alternative you can use docker-compose command

docker-compose up
docker-compose down

API

Here are the endpoints that need to be used to play the game, also there are a Postman collection and environment to test the API. Please, see the postman folder.

User

Register a User

POST /v1/users/register HTTP/1.1
Host: https://minesweeper-jd.herokuapp.com
Content-Type: application/json

{ 
    "email": "jesusdiazbc@gmail.com",
    "password": "demo"
}

Authenticate User

POST /v1/users/auth HTTP/1.1
Host: https://minesweeper-jd.herokuapp.com
Content-Type: application/json

{ 
    "email": "jesusdiazbc@gmail.com",
    "password": "demo"
}

Game

Create a Game

POST /v1/games HTTP/1.1
Host: https://minesweeper-jd.herokuapp.com
Authorization: Bearer <access_token>
Content-Type: application/json

{
    "number_of_rows": 15,
    "number_of_cols": 15,
    "number_of_mines": 20
}

Retrieve a Game

GET /v1/games/<game_id> HTTP/1.1
Host: https://minesweeper-jd.herokuapp.com
Authorization: Bearer <access_token>

List Games

GET /v1/games HTTP/1.1
Host: https://minesweeper-jd.herokuapp.com
Authorization: Bearer <access_token>
Content-Type: application/json

Hold a Game

POST /v1/games/<game_id>/hold HTTP/1.1
Host: https://minesweeper-jd.herokuapp.com
Authorization: Bearer <access_token>

Resume a Game

POST /v1/games/<game_id>/resume HTTP/1.1
Host: https://minesweeper-jd.herokuapp.com
Authorization: Bearer <access_token>

Uncover a Cell

POST /v1/games/<game_id>/uncover/<cell_id> HTTP/1.1
Host: https://minesweeper-jd.herokuapp.com
Authorization: Bearer <access_token>

Flag a Cell

POST /v1/games/<game_id>/flag/<cell_id> HTTP/1.1
Host: https://minesweeper-jd.herokuapp.com
Authorization: Bearer <access_token>

Client Library (Python)

I created a python library to make requests to the API. For more information please go to this repository: https://github.com/jedi4z/minesweeper-api-lib

TODO

  • Add a configuration module using Viper
  • Testing (unit tests and functional tests).
  • Document the API using swagger.
  • Configure CI/CD with any tool like CircleCI, Jenkins or Github Actions.