command module
Version: v0.0.0-...-24b4de3 Latest Latest

This package is not in the latest version of its module.

Go to latest
Published: Feb 19, 2018 License: GPL-2.0-only Imports: 17 Imported by: 0


Achievers server

Build Status Go Report Card GoDoc

Achievers Web API in Go

To download, run the following command:

go get

Quick Start with PostgreSQL

Please ensure all necessary plugins are available by following:


Create database via executing sql script in postgre It is located in /config/postgre.sql Enter postgre and execute

\i {path_to_sql_script}

Open config/config.json and edit the Database section so the connection information matches your Postgre instance.

Build and run from the root directory. Open your REST client to: http://localhost. You should see the welcome message and status 200.

Quick Start with Docker

Build and run the image

Invoke Docker from the achievers_server package directory to build an image using the Dockerfile:

$ docker build -t achievers_server .

This will fetch the golang base image from Docker Hub, copy the package source to it, build the package inside it, and tag the resulting image as achievers_server.

To run a container from the resulting image:

$ docker run --publish 8080:8080 --name achievers_server --rm achievers_server

The --publish flag tells docker to publish the container's port 8080 on the external port 8080.

The --name flag gives our container a predictable name to make it easier to work with.

The --rm flag tells docker to remove the container image when the outyet server exits.

With the container running, open http://localhost:8080/ in a web browser and you should see welcome message.

Now that we've verified that the image works, shut down the running container from another terminal window:

$ docker stop achievers_server 

Available Endpoints

The following endpoints are available:

* GET  /v1/ - Retrieve an welcome message

* POST /v1/user/create - Create new user
* POST /v1/user/auth   - Retrieve an access token

* GET  /v1/profile?id= - Retrieve profile by ID
* GET  /v1/profile/me  - Retrieve your own profile

* POST /v1/achievement/create                 - Create new achievement
* GET  /v1/achievement?id=                    - Retrieve an achievement by ID
* GET  /v1/achievements/last                  - Retrieve last page of achievements
* GET  /v1/achievements/after?after_id=       - Retrieve page of achievements after specified one
* GET  /v1/achievements/quest?id=&page=       - Retrieve achievements by quest_id and page
* GET  /v1/achievements/quest/last            - Retrieve last page of achievements by quest_id
* GET  /v1/achievements/quest/after?after_id= - Retrieve page of achievements by quest_id after specified one

* POST /v1/evidence/create           - Create new evidence 
* GET  /v1/evidence?id=              - Retrieve an evidence by ID
* GET  /v1/evidences/last            - Retrieve last page of evidences
* GET  /v1/evidences/after?after_id= - Retrieve page of evidences after specified one

* POST /v1/reward/create           - Create new reward 
* GET  /v1/reward?id=              - Retrieve a reward by ID
* GET  /v1/rewards/last            - Retrieve last page of rewards
* GET  /v1/rewards/after?after_id= - Retrieve page of rewards after specified one

* POST /v1/quest/create           - Create new quest 
* GET  /v1/quest?id=              - Retrieve a quest by ID
* GET  /v1/quests?page=           - Retrieve quests by page
* GET  /v1/quests/last            - Retrieve last page of rewards
* GET  /v1/quests/after?after_id= - Retrieve page of rewards after specified one

* POST /v1/quest_achievement/create - Create a new quest_achievement

* POST /v1/file/create - Create new file
* GET  /v1/file?id=    - Retrieve a file by ID

Rules for Consistency

Rules for mapping HTTP methods to CRUD:

POST   - Create (add record into database)
GET    - Read (get record from the database)
PUT    - Update (edit record in the database)
DELETE - Delete (remove record from the database)

Rules for status codes:

* Read something - 200 (OK)
* Update something - 200 (OK)
* Delete something - 200 (OK)
* Create something - 201 (Created)
* Create but missing info - 400 (Bad Request)
* Access w/ invalid token - 401 (Unauthorized)
* Any other error - 500 (Internal Server Error)

Rules for messages:

* 200 - item found; no items to find; items deleted; no items to delete; etc
* 201 - item created
* 400 - [field] is missing; [field] needs to be type: [type]
* 401 - unauthorized
* 500 - an error occurred, please try again later (should also log error because it's a programming or server issue)


Run all tests

go test ./... -cover

Run specific package tests with coverage

go test ./app/controller -coverprofile=coverage.out

View coverage result in html

go tool cover -html=coverage.out

TODO // bigger number == higher priority

  1. add kubernetes support
  2. implement constructTest for app/shared/ similar to this in controller/
  3. implement router with following format: router.GET("path", handler, middleware)
  4. use router's handlers to build a help page with endpoints
  5. improve context - replace model instance with model type
  6. improve code coverage
  7. consider unioning db_test's exists and existsMultiple functions (invent smart exister interface)
  8. implement microservices architecture

Done :) // some tasks might not be written

  1. quest_achievement controller
    1. create quest_achievement
    1. get achievements by quest_id
    1. get quests by achievement_id
  1. logger - add log error method
  2. get achievements by quest_id
  3. extract common controller functionalities which return plain Result handlers should have *shared.Request instead of *http.Request which will wrap *http.Request and use it only internally
  4. extract consts from controller/controller.go to shared/consts.go
  5. improve paging concept (pass afterID)
  6. extract framework models from app models
  7. replace paging concept with later/after as implemented in achievement controller
  8. update readme with available endpoints
  9. refactor app/db/ as it should recieve some abstraction
  10. extract limit const from db.go to config and pass it when instantiate
  11. refactor afterID to id in controllers
  12. refactor db's context - extract needed info from model's properties
  13. get rid of db's scan function, use struct tags instead
  14. improve db's create - extract needed fields by struct's tags
  15. create form validation
  16. unify db length constraints


The Go Gopher

There is no documentation for this package.

Source Files

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL