{"id":24465640,"url":"https://github.com/RafalSalwa/auth-api","last_synced_at":"2025-10-01T22:31:01.446Z","repository":{"id":153721132,"uuid":"630085563","full_name":"RafalSalwa/auth-api","owner":"RafalSalwa","description":"Double Opt-In Auth api REST, gRPC, rabbitmq, gorm, CORS and goroutines. Based on monorepo pattern with HTTP and RPC endpoints","archived":false,"fork":false,"pushed_at":"2024-05-31T12:17:13.000Z","size":3652,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"1.x","last_synced_at":"2024-06-01T02:36:13.061Z","etag":null,"topics":["air","amqp","circleci","cqrs","docker-compose","githubactions","go","golang","gorilla-mux","gorm","grpc","grpc-go","jaeger","mongodb","opentelemetry","prometheus","rabbitmq","redis","swagger"],"latest_commit_sha":null,"homepage":"https://auth-api.salwa.com.pl","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RafalSalwa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-04-19T16:28:48.000Z","updated_at":"2024-06-19T02:49:24.379Z","dependencies_parsed_at":"2024-06-19T02:49:17.247Z","dependency_job_id":"0a03a90a-c810-413f-bf6d-358ef541f253","html_url":"https://github.com/RafalSalwa/auth-api","commit_stats":{"total_commits":176,"total_committers":2,"mean_commits":88.0,"dds":0.005681818181818232,"last_synced_commit":"af1134aa39175e1fadaea6cbfbc2476be883cca2"},"previous_names":["rafalsalwa/interview","rafalsalwa/interview-srv-go","rafalsalwa/auth-api","rafalsalwa/interview-app-srv"],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RafalSalwa%2Fauth-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RafalSalwa%2Fauth-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RafalSalwa%2Fauth-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RafalSalwa%2Fauth-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RafalSalwa","download_url":"https://codeload.github.com/RafalSalwa/auth-api/tar.gz/refs/heads/1.x","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234902731,"owners_count":18904524,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["air","amqp","circleci","cqrs","docker-compose","githubactions","go","golang","gorilla-mux","gorm","grpc","grpc-go","jaeger","mongodb","opentelemetry","prometheus","rabbitmq","redis","swagger"],"created_at":"2025-01-21T06:12:19.973Z","updated_at":"2025-10-01T22:31:00.954Z","avatar_url":"https://github.com/RafalSalwa.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Golang monorepo with REST, gRPC, CQRS, opentelemetry, gorillaMUX, swag, mailhog and rabbitMQ \n#### based on docker containers, docker compose, Makefile \n\n[![Go Report Card](https://goreportcard.com/badge/github.com/RafalSalwa/auth-api)](https://goreportcard.com/report/github.com/RafalSalwa/auth-api)\n[![Run Gosec](https://github.com/RafalSalwa/interview-srv-go/actions/workflows/gosec.yml/badge.svg)](https://github.com/RafalSalwa/interview-srv-go/actions/workflows/gosec.yml)\n[![golangci-lint](https://github.com/RafalSalwa/auth-api/actions/workflows/golangci-lint.yml/badge.svg)](https://github.com/RafalSalwa/auth-api/actions/workflows/golangci-lint.yml)\n[![Static check](https://github.com/RafalSalwa/auth-api/actions/workflows/staticcheck.yml/badge.svg)](https://github.com/RafalSalwa/auth-api/actions/workflows/staticcheck.yml)\n[![codecov](https://codecov.io/gh/RafalSalwa/auth-api/graph/badge.svg?token=T0DZIOYDR8)](https://codecov.io/gh/RafalSalwa/auth-api)\n[![Build Status](https://jenkins.salwa.com.pl/job/Auth-Api/badge/icon?subject=Jenkins)](https://jenkins.salwa.com.pl/job/Auth-Api/)\n\nCodacy:\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/c0054f5a3f1343029e2a3acb76931ebc)](https://app.codacy.com/gh/RafalSalwa/auth-api/dashboard?utm_source=gh\u0026utm_medium=referral\u0026utm_content=\u0026utm_campaign=Badge_grade)\n[![Codacy Badge](https://app.codacy.com/project/badge/Coverage/c0054f5a3f1343029e2a3acb76931ebc)](https://app.codacy.com/gh/RafalSalwa/auth-api/dashboard?utm_source=gh\u0026utm_medium=referral\u0026utm_content=\u0026utm_campaign=Badge_coverage)\n\nSonarQube:\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=RafalSalwa_auth-api\u0026metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=RafalSalwa_auth-api)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=RafalSalwa_auth-api\u0026metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=RafalSalwa_auth-api)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=RafalSalwa_auth-api\u0026metric=security_rating)](https://sonarcloud.io/summary/new_code?id=RafalSalwa_auth-api)\n[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=RafalSalwa_auth-api\u0026metric=ncloc)](https://sonarcloud.io/summary/new_code?id=RafalSalwa_auth-api)\n[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=RafalSalwa_auth-api\u0026metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=RafalSalwa_auth-api)\n[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=RafalSalwa_auth-api\u0026metric=coverage)](https://sonarcloud.io/summary/new_code?id=RafalSalwa_auth-api)\n\n\n## Topics Covered\n- REST, gRPC, CQRS, Docker, distributed tracing (jaeger, otel, prometheus,grafana, NewRelics), testify\n- Onion, Clean architecture, Monorepo,\n- Swagger, Postman docs ([/docs](docs) directory)\n- JWT , auth and logging middleware\n- Env with Viper\n- hot reload with cosmtrek/air\n- golangcilint, pre-commit-hooks\n- MySQL, database/sql, gorm\n- Redis\n- MongoDB\n- Jenkins, GitHub actions\n  Plans:\n- .gitlabci, buildspec\n- mockery for testify, more tests\n\n\n## Services:\n![arch](docs/go_arch.png)\n- ### API Gateway\n  - Backend For Frontend approach, gateway takes HTTP requests and decide which service over gRPC should be called\n    - security \u0026 Auth methods \n      - Basic Auth\n      - Bearer Token\n      - API key\n      - JWT\n    - HTTP Handlers based on GorillaMux\n    - Router with middlewares\n      - content_type\n      - correlation_id\n      - CORS\n      - JWT Token decode\n      - request_log\n    - CQRS\n      - separated commands and queries that connect to specific services\n        - example commands: signup, change_password\n        - example queries: sign_in, user_details, get_verification_code\n- ### Auth service\n  - gRPC server for commands:\n    - SignIn\n    - SignUp\n    - Verify  account code\n  - Service layer to manage data flow\n    - rpc -\u003e service -\u003e repositories -\u003e clients\n  - Redis cache to prevent eventual consistency\n  - MongoDB for users \u0026 logs storage\n  - MySQL as main RDBMS for users\n  - RabbitMQ direct queue with dead letter exchange for email sendout\n- ### User service\n  - gRPC server for commands \n    - get user(id)\n    - get user details\n    - change password\n  - Mysql repository based on gORM\n  - Redis cache for cacheable users\n- ### Consumer service\n  - AMQP consumer that read events from rabbitMQ, send emails and store logs in mongoDB\n\n- ### Tester service\n  - workers pool service that constantly creates users from registration, activation and signIn for JWT Tokens\n  - optional daisy chain pattern for concurrency control\n  \n\n## Build\nmake build\n\nmake up\n\n## Run tests\nmake test_unit\n\nmake test_integration\n\n### gRPC\n- make proto\n\n## Credentials\n#### services\n- interview@interview.com:VeryG00dPass!\n\n\nscreenshots:\n![db](docs/db_design.png)\n![jaeger](docs/jaeger.png)\n![postman](docs/postman.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FRafalSalwa%2Fauth-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FRafalSalwa%2Fauth-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FRafalSalwa%2Fauth-api/lists"}