Initial commit
This commit is contained in:
commit
a007fc4c6e
17
.air.toml
Normal file
17
.air.toml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Config file for [Air](https://github.com/cosmtrek/air) in TOML format
|
||||||
|
|
||||||
|
# Working directory
|
||||||
|
# . or absolute path, please note that the directories following must be under root.
|
||||||
|
root = "."
|
||||||
|
tmp_dir = "tmp"
|
||||||
|
|
||||||
|
[build]
|
||||||
|
# Just plain old shell command. You could use `make` as well.
|
||||||
|
cmd = "go build -gcflags=all=\"-N -l\" -o ./tmp/main ./cmd/api/main.go"
|
||||||
|
# Binary file yields from `cmd`.
|
||||||
|
bin = "tmp/main"
|
||||||
|
# Customize binary.
|
||||||
|
full_bin = "dlv exec --accept-multiclient --log --log-output=rpc,debugger --headless --continue --listen='0.0.0.0:40000' --api-version=2 ./tmp/main"
|
||||||
|
|
||||||
|
# Watch these filename extensions.
|
||||||
|
include_ext = ["go", "tpl", "tmpl", "html"]
|
5
.env.sample
Normal file
5
.env.sample
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# App config
|
||||||
|
APP_PORT=8080
|
||||||
|
|
||||||
|
# JWT
|
||||||
|
JWT_KEY=jwtkey
|
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
/tmp
|
||||||
|
/docker/_data/mysql
|
||||||
|
/docker/_data/certs
|
||||||
|
/docker/_data/logs
|
||||||
|
.env
|
||||||
|
.env.test
|
||||||
|
.devcontainer.json
|
||||||
|
.vscode
|
||||||
|
debug.test
|
||||||
|
.dlv.yml
|
38
cmd/api/main.go
Normal file
38
cmd/api/main.go
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"onyx-api/internal/config"
|
||||||
|
"onyx-api/internal/server"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
// Load config
|
||||||
|
log.Println("Loading Server Configurations...")
|
||||||
|
cfg, err := config.LoadConfig()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Error loading config: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// New server with proper config
|
||||||
|
App := server.NewServer(cfg, db, mail)
|
||||||
|
|
||||||
|
// Load Router
|
||||||
|
err = App.Routes()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Error Loading routes: %v", err)
|
||||||
|
} else {
|
||||||
|
log.Printf("Routes loaded.")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run the server
|
||||||
|
err = App.Run()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Error running the app: %v", err)
|
||||||
|
} else {
|
||||||
|
log.Printf("App up and running.")
|
||||||
|
}
|
||||||
|
}
|
6
docker/.env.sample
Normal file
6
docker/.env.sample
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# Docker environment (local, staging, production)
|
||||||
|
DOCKER_ENV=local
|
||||||
|
|
||||||
|
# Nginx virtualhost (.env)
|
||||||
|
VPORT=8080
|
||||||
|
DEBUG_PORT=40000
|
17
docker/Dockerfile
Normal file
17
docker/Dockerfile
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
|
FROM golang:1.19-alpine
|
||||||
|
|
||||||
|
WORKDIR /code
|
||||||
|
|
||||||
|
RUN apk add bash gcc-go musl-dev tzdata && \
|
||||||
|
echo "=> Configuring and installing timezone/locale" && \
|
||||||
|
export TZ=Europe/Madrid && \
|
||||||
|
cp /usr/share/zoneinfo/Europe/Madrid /etc/localtime
|
||||||
|
|
||||||
|
|
||||||
|
COPY ./scripts/entrypoint.sh /entrypoint.sh
|
||||||
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
|
CMD ["run-server"]
|
||||||
|
|
||||||
|
VOLUME /code
|
318
docker/Makefile
Normal file
318
docker/Makefile
Normal file
@ -0,0 +1,318 @@
|
|||||||
|
##
|
||||||
|
# Makefile to help manage docker-compose services
|
||||||
|
#
|
||||||
|
# Built on top of those resources:
|
||||||
|
# https://gist.github.com/iNamik/cafef08f9d931cbf7acb012075052912
|
||||||
|
# https://github.com/krom/docker-compose-makefile/tree/master/samples
|
||||||
|
#
|
||||||
|
|
||||||
|
# Include environment files
|
||||||
|
include ../.env
|
||||||
|
include .env
|
||||||
|
export
|
||||||
|
|
||||||
|
THIS_FILE := Makefile
|
||||||
|
DOCKER := docker
|
||||||
|
DOCKER_COMPOSE := docker-compose
|
||||||
|
DOCKER_COMPOSE_FILES := -f docker-compose.yml
|
||||||
|
ifeq ($(DOCKER_ENV),staging)
|
||||||
|
DOCKER_COMPOSE_FILES := -f docker-compose.yml
|
||||||
|
endif
|
||||||
|
ifeq ($(DOCKER_ENV),production)
|
||||||
|
DOCKER_COMPOSE_FILES := -f docker-compose.yml
|
||||||
|
endif
|
||||||
|
|
||||||
|
CERT_DOMAIN := api.onyx.local
|
||||||
|
IMAGE_DEFAULT := onyx-api
|
||||||
|
CONTAINER_DEFAULT := onyx-api-1
|
||||||
|
SERVICES_DEFAULT := api
|
||||||
|
|
||||||
|
SERVICE_DEFAULT := api
|
||||||
|
|
||||||
|
NETWORK := app
|
||||||
|
NETWORK_PROXY := nginx-proxy
|
||||||
|
|
||||||
|
BACKUP_SERVICE := backup
|
||||||
|
RESTORE_SERVICE := restore
|
||||||
|
|
||||||
|
SHELL_CMD := /bin/bash
|
||||||
|
|
||||||
|
container ?= $(CONTAINER_DEFAULT)
|
||||||
|
image ?= $(IMAGE_DEFAULT)
|
||||||
|
service ?=
|
||||||
|
services ?= $(SERVICES_DEFAULT)
|
||||||
|
test ?= A
|
||||||
|
package ?= chargers
|
||||||
|
|
||||||
|
.DEFAULT_GOAL := help
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# help
|
||||||
|
#
|
||||||
|
help:
|
||||||
|
ifeq ($(CONTAINER_DEFAULT),)
|
||||||
|
$(warning WARNING: CONTAINER_DEFAULT is not set. Please edit makefile)
|
||||||
|
endif
|
||||||
|
@echo
|
||||||
|
@echo "Make targets:"
|
||||||
|
@echo
|
||||||
|
@cat $(THIS_FILE) | \
|
||||||
|
sed -n -E 's/^([^.][^: ]+)\s*:(([^=#]*##\s*(.*[^[:space:]])\s*)|[^=].*)$$/ \1 \4/p' | \
|
||||||
|
sort -u | \
|
||||||
|
expand -t15
|
||||||
|
@echo
|
||||||
|
@echo
|
||||||
|
@echo "Target arguments:"
|
||||||
|
@echo
|
||||||
|
@echo " " "service" "\t" "Target service for docker-compose actions (default=all-services)"
|
||||||
|
@echo " " " " "\t" " - make start"
|
||||||
|
@echo " " " " "\t" " - make start services=app"
|
||||||
|
@echo " " "services" "\t" "Target services for docker-compose actions (default=all-services, space separated)"
|
||||||
|
@echo " " " " "\t" " - make stop services='app mysql'"
|
||||||
|
@echo " " "container""\t" "Target container for docker actions (default='$(CONTAINER_DEFAULT)')"
|
||||||
|
@echo " " " " "\t" " - make bash container=$(container)"
|
||||||
|
@echo " " "image" "\t" "Target image for interactive shell (default='$(IMAGE_DEFAULT)')"
|
||||||
|
@echo " " " " "\t" " - make it image=$(image)"
|
||||||
|
@echo " " "test" "\t" "Run custom test (default='$(test)')"
|
||||||
|
@echo " " " " "\t" " - make test test=$(test)"
|
||||||
|
@echo " " "testdlv" "\t" "Run a 'dlv test' with a custom package (default='$(package)')"
|
||||||
|
@echo " " " " "\t" " - make testdlv package=$(package)"
|
||||||
|
|
||||||
|
##
|
||||||
|
# services
|
||||||
|
#
|
||||||
|
services: ## Lists services
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) ps --services
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# start
|
||||||
|
#
|
||||||
|
all: dev ## See 'dev'
|
||||||
|
start: dev ## See 'dev'
|
||||||
|
dev: ## Start containers for development [service|services]
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) up -d $(services)
|
||||||
|
$(MAKE) logs
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# stop
|
||||||
|
#
|
||||||
|
stop: ## Stop containers [service|services]
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) stop $(services)
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# restart
|
||||||
|
#
|
||||||
|
restart: ## Restart containers [service|services]
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) restart $(services)
|
||||||
|
$(MAKE) logs
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# down
|
||||||
|
#
|
||||||
|
down: ## Removes containers (preserves images and volumes)
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) down
|
||||||
|
|
||||||
|
|
||||||
|
create-network:
|
||||||
|
ifeq ($(DOCKER_ENV),local)
|
||||||
|
@echo
|
||||||
|
@echo "Creating proper network ($(NETWORK)) for the project"
|
||||||
|
@$(DOCKER) network create $(NETWORK) 2> /dev/null || true
|
||||||
|
@echo "Creating proper network ($(NETWORK_PROXY)) for the nginx proxy"
|
||||||
|
@$(DOCKER) network create $(NETWORK_PROXY) 2> /dev/null || true
|
||||||
|
endif
|
||||||
|
|
||||||
|
##
|
||||||
|
# build
|
||||||
|
#
|
||||||
|
build: create-network ## Builds service images [service|services]
|
||||||
|
ifeq ($(DOCKER_ENV),local)
|
||||||
|
if [ ! -d "_data/certs" ]; then mkdir -p "_data/certs"; fi
|
||||||
|
test -f _data/certs/$(CERT_DOMAIN).key && test -f _data/certs/$(CERT_DOMAIN).crt || mkcert -key-file _data/certs/$(CERT_DOMAIN).key -cert-file _data/certs/$(CERT_DOMAIN).crt $(CERT_DOMAIN) "*.$(CERT_DOMAIN)"
|
||||||
|
endif
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) build $(services)
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# rebuild
|
||||||
|
#
|
||||||
|
rebuild: ## Build containers without cache [service|services]
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) build --no-cache $(services)
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# ps
|
||||||
|
#
|
||||||
|
status: ps ## See 'ps'
|
||||||
|
ps: ## Show status of containers
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) ps
|
||||||
|
|
||||||
|
##
|
||||||
|
# interact
|
||||||
|
#
|
||||||
|
interact: it ## See 'it'
|
||||||
|
it: ## Run a new container in interactive mode. Needs image name [image]
|
||||||
|
ifeq ($(image),)
|
||||||
|
$(error ERROR: 'image' is not set. Please provide 'image=' argument or edit makefile and set CONTAINER_DEFAULT)
|
||||||
|
endif
|
||||||
|
@echo
|
||||||
|
@echo "Starting interactive shell ($(SHELL_CMD)) in image container '$(image)'"
|
||||||
|
@$(DOCKER) run -it --entrypoint "$(SHELL_CMD)" $(image)
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# bash
|
||||||
|
#
|
||||||
|
sh: bash ## See 'bash'
|
||||||
|
shell: bash ## See 'bash'
|
||||||
|
bash: ## Brings up a shell in default (or specified) container [container]
|
||||||
|
ifeq ($(container),)
|
||||||
|
$(error ERROR: 'container' is not set. Please provide 'container=' argument or edit makefile and set CONTAINER_DEFAULT)
|
||||||
|
endif
|
||||||
|
@echo
|
||||||
|
@echo "Starting shell ($(SHELL_CMD)) in container '$(container)'"
|
||||||
|
@$(DOCKER) exec -it "$(container)" "$(SHELL_CMD)"
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# attach
|
||||||
|
#
|
||||||
|
at: attach ## See 'attach'
|
||||||
|
attach: ## Attach to a running container [container]
|
||||||
|
ifeq ($(container),)
|
||||||
|
$(error ERROR: 'container' is not set. Please provide 'container=' argument or edit makefile and set CONTAINER_DEFAULT)
|
||||||
|
endif
|
||||||
|
@echo
|
||||||
|
@echo "Attaching to '$(container)'"
|
||||||
|
@$(DOCKER) attach $(container)
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# log
|
||||||
|
#
|
||||||
|
log: ## Shows log from a specific container (in 'follow' mode) [container]
|
||||||
|
ifeq ($(container),)
|
||||||
|
$(error ERROR: 'container' is not set. Please provide 'container=' argument or edit makefile and set CONTAINER_DEFAULT)
|
||||||
|
endif
|
||||||
|
@echo
|
||||||
|
@echo "Log in $(container)"
|
||||||
|
@$(DOCKER) logs -f $(container)
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# logs
|
||||||
|
#
|
||||||
|
logs: ## Shows output of running containers (in 'follow' mode) [service|services]
|
||||||
|
@echo
|
||||||
|
@echo "Logs in $(services)"
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) logs -f $(services)
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# rmimages
|
||||||
|
#
|
||||||
|
rmimages: ## Remove images
|
||||||
|
@echo
|
||||||
|
@echo "Remove local images"
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) down --rmi local
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# rmvols
|
||||||
|
#
|
||||||
|
rmvols: ## Remove volumes
|
||||||
|
@echo
|
||||||
|
@echo "Remove named volumes declared in the volumes section of the Compose file and anonymous volumes attached to containers"
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) down -v
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# rm
|
||||||
|
#
|
||||||
|
rm: rmimages rmvols ## Remove volumes and images
|
||||||
|
|
||||||
|
##
|
||||||
|
# clean
|
||||||
|
#
|
||||||
|
clean: ## Remove containers, images and volumes
|
||||||
|
@echo
|
||||||
|
@echo "Remove containers, images and volumes"
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) down --volumes --rmi all
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# backup
|
||||||
|
#
|
||||||
|
backup: ## Run 'backup' service
|
||||||
|
@echo
|
||||||
|
@echo "Running '$(BACKUP_SERVICE)'"
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) run $(BACKUP_SERVICE)
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# restore
|
||||||
|
#
|
||||||
|
restore: ## Run 'restore' service
|
||||||
|
@echo
|
||||||
|
@echo "Running '$(BACKUP_SERVICE)'"
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) run $(RESTORE_SERVICE)
|
||||||
|
|
||||||
|
##
|
||||||
|
# tests
|
||||||
|
#
|
||||||
|
tests: ## Run all the battery tests
|
||||||
|
@echo
|
||||||
|
@echo "Running tests"
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) run --rm tests
|
||||||
|
|
||||||
|
##
|
||||||
|
# test
|
||||||
|
#
|
||||||
|
test: ## Run 'tests' service with a custom test [test=A]
|
||||||
|
ifneq ($(DOCKER_ENV),production)
|
||||||
|
@echo
|
||||||
|
@echo "Running test $(test)"
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) run --rm tests gotest -v -run $(test) ./...
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# testdlv
|
||||||
|
#
|
||||||
|
testdlv: ## Run a 'dlv test' with a custom package for debug purposes [package=chargers]
|
||||||
|
ifneq ($(DOCKER_ENV),production)
|
||||||
|
@echo
|
||||||
|
@echo "Running test $(test)"
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) run --rm tests dlv test /code/internal/$(package)
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# recreate_test_db
|
||||||
|
#
|
||||||
|
recreate_test_db: ## Recrete test db
|
||||||
|
ifneq ($(DOCKER_ENV),production)
|
||||||
|
@echo
|
||||||
|
@echo "Recreate test db from init sql schemas"
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) stop $(MYSQL_TEST)
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) rm $(MYSQL_TEST)
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) up -d $(MYSQL_TEST)
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
# dumplog
|
||||||
|
#
|
||||||
|
dumplog: ## Run 'dumplog' [service|services]
|
||||||
|
if [ ! -d "_data/logs" ]; then mkdir -p "_data/logs"; fi
|
||||||
|
@echo
|
||||||
|
@echo "Running 'dumplog'"
|
||||||
|
@$(DOCKER_COMPOSE) $(DOCKER_COMPOSE_FILES) logs --no-color --since 24h --timestamps $(services)
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: help services all start dev stop restart down create-network build rebuild status ps interact it sh shell bash at attach log logs rm rmimages rmvols clean backup restore tests test testdlv recreate_test_db dumplog
|
36
docker/docker-compose.yml
Normal file
36
docker/docker-compose.yml
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
version: "3.7"
|
||||||
|
name: "onyx"
|
||||||
|
|
||||||
|
# Services
|
||||||
|
services:
|
||||||
|
|
||||||
|
# App
|
||||||
|
api:
|
||||||
|
build: .
|
||||||
|
env_file:
|
||||||
|
- ./.env
|
||||||
|
- ../.env
|
||||||
|
restart: unless-stopped
|
||||||
|
command: ["run-server"]
|
||||||
|
stdin_open: true
|
||||||
|
tty: true
|
||||||
|
ports:
|
||||||
|
- ${VPORT}:${VPORT}
|
||||||
|
- ${DEBUG_PORT}:${DEBUG_PORT}
|
||||||
|
environment:
|
||||||
|
- VIRTUAL_HOST=${VHOST}
|
||||||
|
- VIRTUAL_PORT=${VPORT}
|
||||||
|
networks:
|
||||||
|
- app
|
||||||
|
- default
|
||||||
|
volumes:
|
||||||
|
- ../:/code/
|
||||||
|
|
||||||
|
# Docker Networks
|
||||||
|
networks:
|
||||||
|
default:
|
||||||
|
name: nginx-proxy
|
||||||
|
external: true
|
||||||
|
app:
|
||||||
|
driver: bridge
|
||||||
|
|
43
docker/scripts/entrypoint.sh
Executable file
43
docker/scripts/entrypoint.sh
Executable file
@ -0,0 +1,43 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
function wait_service {
|
||||||
|
echo -e "\n-> Waiting for service $1, $2...\n"
|
||||||
|
while ! nc -z $1 $2; do
|
||||||
|
exec sleep 1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_general_dependencies {
|
||||||
|
echo -e "\n-> Installing general dependencies...\n"
|
||||||
|
go get -u github.com/cosmtrek/air
|
||||||
|
go install github.com/cosmtrek/air
|
||||||
|
go install github.com/go-delve/delve/cmd/dlv@latest
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_app_dependencies {
|
||||||
|
echo -e "\n-> Installing app dependencies...\n"
|
||||||
|
cd /code
|
||||||
|
go mod tidy
|
||||||
|
}
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
run-server)
|
||||||
|
wait_service $DATABASE_HOST $DATABASE_PORT
|
||||||
|
install_general_dependencies
|
||||||
|
install_app_dependencies
|
||||||
|
echo -e "\n-> Run server...\n"
|
||||||
|
exec air
|
||||||
|
;;
|
||||||
|
run-tests)
|
||||||
|
install_app_dependencies
|
||||||
|
echo -e "\n-> Run tests...\n"
|
||||||
|
exec gotest -v ./...
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exec "$@"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
21
go.mod
Normal file
21
go.mod
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
module onyx-api
|
||||||
|
|
||||||
|
go 1.19
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/joho/godotenv v1.5.1
|
||||||
|
github.com/labstack/echo/v4 v4.11.1
|
||||||
|
github.com/mitchellh/mapstructure v1.5.0
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/labstack/gommon v0.4.0 // indirect
|
||||||
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||||
|
github.com/mattn/go-isatty v0.0.19 // indirect
|
||||||
|
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||||
|
github.com/valyala/fasttemplate v1.2.2 // indirect
|
||||||
|
golang.org/x/crypto v0.11.0 // indirect
|
||||||
|
golang.org/x/net v0.12.0 // indirect
|
||||||
|
golang.org/x/sys v0.10.0 // indirect
|
||||||
|
golang.org/x/text v0.11.0 // indirect
|
||||||
|
)
|
45
go.sum
Normal file
45
go.sum
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
||||||
|
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
||||||
|
github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4=
|
||||||
|
github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ=
|
||||||
|
github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8=
|
||||||
|
github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM=
|
||||||
|
github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
||||||
|
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||||
|
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||||
|
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
|
||||||
|
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||||
|
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
|
||||||
|
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
|
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||||
|
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||||
|
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
||||||
|
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||||
|
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
|
||||||
|
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
|
||||||
|
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
|
||||||
|
golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
|
||||||
|
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
|
||||||
|
golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
|
||||||
|
golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
|
||||||
|
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
|
||||||
|
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
|
||||||
|
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
32
internal/config/config.go
Executable file
32
internal/config/config.go
Executable file
@ -0,0 +1,32 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/joho/godotenv"
|
||||||
|
"github.com/mitchellh/mapstructure"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
AppPortListen string `mapstructure:"APP_PORT"`
|
||||||
|
JwtKey []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadConfig(filename ...string) (*Config, error) {
|
||||||
|
var myenv map[string]string
|
||||||
|
var err error
|
||||||
|
var c Config
|
||||||
|
|
||||||
|
if len(filename) == 0 {
|
||||||
|
myenv, err = godotenv.Read()
|
||||||
|
} else {
|
||||||
|
myenv, err = godotenv.Read(filename[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
mapstructure.Decode(myenv, &c)
|
||||||
|
c.JwtKey = []byte(c.StringKey)
|
||||||
|
|
||||||
|
return &c, nil
|
||||||
|
}
|
32
internal/data/controller.go
Executable file
32
internal/data/controller.go
Executable file
@ -0,0 +1,32 @@
|
|||||||
|
package data
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"net/http"
|
||||||
|
"onyx-api/internal/config"
|
||||||
|
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Controller struct {
|
||||||
|
cfg *config.Config
|
||||||
|
dataRepo dataRepo
|
||||||
|
}
|
||||||
|
|
||||||
|
// New controller constructor
|
||||||
|
func NewController(cfg *config.Config) *Controller {
|
||||||
|
return &Controller{cfg: cfg}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Controller) Ping() echo.HandlerFunc {
|
||||||
|
return func(e echo.Context) error {
|
||||||
|
return e.JSON(http.StatusOK, "pong")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Controller) GetAllProjects() echo.HandlerFunc {
|
||||||
|
return func(e echo.Context) error {
|
||||||
|
projets := ["Uno", "Dos", Tres]
|
||||||
|
return e.JSON(http.StatusOK, chargers)
|
||||||
|
}
|
||||||
|
}
|
17
internal/data/model.go
Executable file
17
internal/data/model.go
Executable file
@ -0,0 +1,17 @@
|
|||||||
|
package data
|
||||||
|
|
||||||
|
type Project struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Issues []Issues `json:"issues"`
|
||||||
|
Notes []Notes `json:"notes"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Issues struct {
|
||||||
|
Description string `json:"description"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Notes struct {
|
||||||
|
Description string `json:"description"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
}
|
22
internal/data/routes.go
Executable file
22
internal/data/routes.go
Executable file
@ -0,0 +1,22 @@
|
|||||||
|
package chargers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"onyx-api/internal/config"
|
||||||
|
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Routes struct {
|
||||||
|
cfg *config.Config
|
||||||
|
controller *Controller
|
||||||
|
}
|
||||||
|
|
||||||
|
// New controller constructor
|
||||||
|
func NewRouter(cfg *config.Config, Controller *Controller) *Routes {
|
||||||
|
return &Routes{cfg: cfg, controller: Controller}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Routes) MapRoutes(g *echo.Group) {
|
||||||
|
g.GET("/", r.controller.Ping())
|
||||||
|
g.GET("/all", r.controller.GetAllProjects())
|
||||||
|
}
|
71
internal/server/routes.go
Executable file
71
internal/server/routes.go
Executable file
@ -0,0 +1,71 @@
|
|||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
// github.com/labstack/echo/v4"
|
||||||
|
//"github.com/golang-jwt/jwt/v4"
|
||||||
|
//echojwt "github.com/labstack/echo-jwt"
|
||||||
|
"api-users/internal/chargers"
|
||||||
|
"api-users/internal/users"
|
||||||
|
//"api-users/internal/auth"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *Server) Routes() error {
|
||||||
|
|
||||||
|
// Init repositories
|
||||||
|
usersRepo := users.NewUsersRepository(s.db)
|
||||||
|
chargersRepo := chargers.NewChargersRepository(s.db)
|
||||||
|
|
||||||
|
// Init controllers
|
||||||
|
usersController := users.NewUsersController(s.config, usersRepo, s.mailer)
|
||||||
|
chargersController := chargers.NewChargersController(s.config, chargersRepo)
|
||||||
|
|
||||||
|
// Init custom routes
|
||||||
|
usersRoutes := users.NewUsersRouter(s.config, usersController)
|
||||||
|
chargersRoutes := chargers.NewChargersRouter(s.config, chargersController)
|
||||||
|
|
||||||
|
//chargersHttp := chargers.NewChargersHttpHandlers
|
||||||
|
|
||||||
|
// Set routes
|
||||||
|
e := s.router
|
||||||
|
v1 := e.Group("/api/v1")
|
||||||
|
|
||||||
|
// Users routes
|
||||||
|
// usersGroup := v1.Group("/users")
|
||||||
|
usersRoutes.MapUsersRoutes(v1)
|
||||||
|
|
||||||
|
// Chargers routes
|
||||||
|
chargersGroup := v1.Group("/chargers")
|
||||||
|
chargersRoutes.MapChargersRoutes(chargersGroup)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
/*log.Println("Loading routes...")
|
||||||
|
s.Router = echo.New()
|
||||||
|
//router_config := echojwt.Config{
|
||||||
|
// SigningKey: s.Config.JwtKey,
|
||||||
|
// NewClaimsFunc: func(c echo.Context) jwt.Claims {
|
||||||
|
// return new(auth.JWTClaim)
|
||||||
|
// },
|
||||||
|
//}
|
||||||
|
|
||||||
|
// Init repositories
|
||||||
|
// userRepo := usersRepository.NewUsersRepository(s.DB)
|
||||||
|
chargerRepo := chargersRepo.NewChargersRepo(s.DB)
|
||||||
|
|
||||||
|
api := s.Router.Group("/api")
|
||||||
|
{
|
||||||
|
// Users
|
||||||
|
// api.POST("/auth", controllers.GenerateToken)
|
||||||
|
// secured := api.Group("/user")
|
||||||
|
// {
|
||||||
|
// secured.Use(echojwt.WithConfig(router_config))
|
||||||
|
// secured.GET("", controllers.GetUser)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Chargers
|
||||||
|
// api.GET("/chargers", controllers.GetChargers)
|
||||||
|
api.GET("/chargers/all", chargerRepo.GetAllChargers)
|
||||||
|
// api.GET("/chargers/:id", controllers.GetChargerByID)
|
||||||
|
// api.GET("/chargers/search/:q", controllers.SearchChargers)
|
||||||
|
}
|
||||||
|
return nil*/
|
||||||
|
}
|
30
internal/server/server.go
Executable file
30
internal/server/server.go
Executable file
@ -0,0 +1,30 @@
|
|||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"onyx-api/internal/config"
|
||||||
|
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
|
)
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
type Server struct {
|
||||||
|
router *echo.Echo
|
||||||
|
config *config.Config
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewServer(cfg *config.Config) *Server {
|
||||||
|
return &Server{config: cfg, router: echo.New()}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) Run() error {
|
||||||
|
err = s.router.Start(":" + s.config.AppPortListen)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error starting Server")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user