Skip to content

thewizardplusplus/go-exercises-backend

Repository files navigation

go-exercises-backend

GoDoc Go Report Card Build Status

Back-end of the service for solving programming exercises.

Features

  • RESTful API:
    • models:
      • task model:
        • storing:
          • author ID;
          • title;
          • description;
          • boilerplate code;
          • test cases:
            • all test cases are represented by a single string;
        • operations:
          • getting all tasks:
            • calculate a total correctness flag based on all solutions of a requesting author;
            • sort the results by creation time in descending order;
            • process pagination:
              • implemented using an offset and a limit;
          • getting a single task by an ID:
            • calculate a total correctness flag based on all solutions of a requesting author;
          • creating:
            • automatically format a task boilerplate code;
          • updating by an ID:
            • allowed for its author only;
            • automatically format a task boilerplate code;
          • deleting by an ID:
            • allowed for its author only;
      • solution model:
        • storing:
          • author ID;
          • task ID;
          • code;
          • correctness flag;
          • testing result:
            • represented by a string;
        • operations:
          • getting all solutions by a task ID:
            • filtered by a requesting author:
              • allow a solution task author to get solutions of other authors;
            • sort the results by creation time in descending order;
            • process pagination:
              • implemented using an offset and a limit;
          • getting a single solution by an ID:
            • allowed for:
              • solution author;
              • solution task author;
          • creating:
            • automatically format a solution code;
          • updating by an ID:
            • performed by a queue consumer only (see below);
          • formatting a solution code;
    • representing:
      • in a JSON:
        • payloads:
          • of requests;
          • of responses;
      • as a plain text:
        • errors;
  • server:
    • additional routing:
      • serving static files;
    • storing settings in environment variables;
    • supporting graceful shutdown;
    • logging:
      • logging requests;
      • logging errors;
    • panics:
      • recovering on panics;
      • logging of panics;
  • authentication:
    • use the Bearer authentication scheme based on JSON Web Tokens:
      • store in a JWT claims:
        • expiration time claim;
        • user claim:
          • contains a whole user model;
    • generate a token signing key automatically by default;
    • user model:
      • storing:
        • username (unique);
        • password hash:
          • generated using the bcrypt function;
        • flag indicating whether the user is disabled or not;
  • databases:
  • interaction with queues:
    • using the RabbitMQ message broker;
    • common properties:
      • automatic declaring of the used queues;
      • passing of a message data in JSON;
    • operations:
      • producing solutions:
        • concurrent producing;
      • consuming solution results:
        • concurrent consuming;
        • once requeue the solution on failure;
  • utilities:
    • utility for managing users:
      • commands:
        • add a user:
          • parameters:
            • username;
            • password;
            • password hashing cost;
            • flag indicating the need to generate a password;
            • generated password length;
            • flag indicating whether the user is disabled or not;
        • update a user:
          • parameters:
            • username;
            • new username;
            • password;
            • password hashing cost;
            • flag indicating the need to generate a password;
            • generated password length;
            • flag indicating whether the user is disabled or not;
            • flag indicating whether the user is enabled or not;
          • can update the user fields individually;
  • distributing:

Installation

Prepare the directory:

$ mkdir --parents "$(go env GOPATH)/src/github.com/thewizardplusplus/"
$ cd "$(go env GOPATH)/src/github.com/thewizardplusplus/"

Clone this repository:

$ git clone https://github.com/thewizardplusplus/go-exercises-backend.git
$ cd go-exercises-backend

Install dependencies with the dep tool:

$ dep ensure -vendor-only

Build the project:

$ go install ./...

Migration

The necessary tables will be created automatically on service starting.

Then run the manual migration to create a few example tasks (optionally):

$ ./tools/migrate.sh -h | --help
$ ./tools/migrate.sh

Options:

  • -h, --help — show the help message and exit.

Environment variables:

  • PATH_TO_MIGRATIONS — path to migrations (default: ./migrations);
  • STORAGE_ADDRESSPostgreSQL connection URI (default: postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable).

The following example tasks will be created:

  1. Sum of Two Numbers (Test Task)
  2. Sum of Array
  3. Product of Array
  4. Minimum of Array
  5. Maximum of Array
  6. Index of Array Minimum
  7. Index of Array Maximum
  8. Search in Array
  9. Search in Array (Last Occurrence)
  10. Filtering of Array
  11. Filtering of Array (In-place)
  12. Removing of Duplicates
  13. Removing of Duplicates (In-place)

The solutions for the example tasks: docs/_solutions.

Usage

$ go-exercises-backend

Environment variables:

  • SERVER_STATIC_FILE_PATH — path to static files (default: ./static);
  • addresses:
    • SERVER_ADDRESS — server URI (default: :8080);
    • STORAGE_ADDRESSPostgreSQL connection URI (default: postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable);
    • MESSAGE_BROKER_ADDRESSRabbitMQ connection URI (default: amqp://rabbitmq:rabbitmq@localhost:5672);
  • solution registration:
    • SOLUTION_REGISTER_BUFFER_SIZE — solution registration channel capacity (default: 1000);
    • SOLUTION_REGISTER_CONCURRENCY — amount of solution registration threads (default: 1000);
  • authorization:
    • AUTHORIZATION_TOKEN_SIGNING_KEY — authorization token signing key (is generated automatically if empty; default: empty);
    • AUTHORIZATION_TOKEN_TTL — authorization token TTL (default: 24h).

API Description

API description:

Utilities

License

The MIT License (MIT)

Copyright © 2021-2022 thewizardplusplus