Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
1f410ad
Initial commit
joaooliveira247 Mar 26, 2025
ed21318
chore(git): add .gitignore
joaooliveira247 Mar 26, 2025
fffbd09
chore(package): add gorm.io/gorm
joaooliveira247 Mar 26, 2025
732c065
chore(package): add gorm.io/driver/postgres
joaooliveira247 Mar 26, 2025
15b3492
chore(package): add github.com/google/uuid
joaooliveira247 Mar 26, 2025
995dc79
chore(package): add github.com/gin-gonic/gin
joaooliveira247 Mar 26, 2025
05e6072
feat(config): add DATABASE_URL for database connection
joaooliveira247 Mar 26, 2025
ba8c56e
feat(config): add LoadEnv func to get DATABASE_URL from env
joaooliveira247 Mar 26, 2025
811b341
feat(models): add BaseModel struct
joaooliveira247 Mar 26, 2025
8f39e92
feat(models): add UsersModel struct
joaooliveira247 Mar 26, 2025
1613d0e
feat(models): add Users Validate method to custom validation of email…
joaooliveira247 Mar 26, 2025
a85b71c
feat(db): add GetDbConnection func
joaooliveira247 Mar 26, 2025
12b2497
feat(repositories): add UsersRepositories struct
joaooliveira247 Mar 26, 2025
7795314
feat(repositories): add NewUsersRepository func
joaooliveira247 Mar 26, 2025
a8401fc
feat(repositories): add UsersRepository Create method
joaooliveira247 Mar 26, 2025
10ec559
chore(docker): add docker-compose database instace to run project in …
joaooliveira247 Mar 26, 2025
cbe52fa
feat(db): add CreateTables func
joaooliveira247 Mar 27, 2025
e47cd94
feat(models): add Users IsEmpty method
joaooliveira247 Mar 27, 2025
8c39467
feat(models): add Points struct model
joaooliveira247 Mar 27, 2025
9ea1292
feat(models): add Competitions struct model
joaooliveira247 Mar 27, 2025
8fc5f8a
feat(models): add Competitions IsEmpty method
joaooliveira247 Mar 27, 2025
40f191a
feat(repositories): add PointsRepositories struct
joaooliveira247 Mar 27, 2025
c077485
feat(repositories): add NewPointsRepository func
joaooliveira247 Mar 27, 2025
af23e3b
feat(repositories): add PointsRepository AddPoint method
joaooliveira247 Mar 27, 2025
33d2edf
feat(repositories): add UsersRepository GetUserByAffiliateCode method
joaooliveira247 Mar 27, 2025
4e508cb
feat(repositories): add CompetitionsRepository struct
joaooliveira247 Mar 27, 2025
ec374fd
feat(repositories): add NewCompetitionsRepository func
joaooliveira247 Mar 27, 2025
b02c4ed
feat(repositories): add CompetitionsRepository Create method
joaooliveira247 Mar 27, 2025
cef17a9
feat(repositories): add CompetitionsRepository GetActiveCompetition m…
joaooliveira247 Mar 27, 2025
84a2106
feat(repositories): add CompetitionsRepository CloseCompetition method
joaooliveira247 Mar 27, 2025
67ad2b2
feat(controllers): add UsersControllers struct
joaooliveira247 Mar 27, 2025
1f0683c
feat(controllers): add NewUsersController func
joaooliveira247 Mar 27, 2025
9f0ac7d
feat(controllers): add UsersController Create method
joaooliveira247 Mar 27, 2025
4661187
feat(utils): add GenerateAffiliateCode func
joaooliveira247 Mar 27, 2025
4c5c806
feat(utils): add EmailValidator func
joaooliveira247 Mar 27, 2025
46c8b8a
feat(utils): add IsPhoneNumber func
joaooliveira247 Mar 27, 2025
c782431
feat(controllers): add CompetitionsControllers struct
joaooliveira247 Mar 27, 2025
ff1fcd5
feat(controllers): add NewCompetitionsController func
joaooliveira247 Mar 27, 2025
60c62a9
feat(controllers): add CompetitionsController Create method
joaooliveira247 Mar 27, 2025
05b1f7f
feat(controllers): add CompetitionsController GetCompetition method
joaooliveira247 Mar 27, 2025
0598df0
feat(controllers): add CompetitionsController CloseCompetition method
joaooliveira247 Mar 27, 2025
7c58e55
feat(routes): add UsersRoute func
joaooliveira247 Mar 27, 2025
ebbab65
feat(routes): add CompetitionsRoute func
joaooliveira247 Mar 27, 2025
496a30e
feat(routes): add RegistryRoutes func
joaooliveira247 Mar 27, 2025
6609544
chore(docker) add docker file with air to run project
joaooliveira247 Mar 27, 2025
b328545
feat(main) add init func to load env
joaooliveira247 Mar 27, 2025
fc19e4c
feat(main) add main func to run project
joaooliveira247 Mar 27, 2025
69e948a
chore(docker) add container instace to run api
joaooliveira247 Mar 27, 2025
00e519e
fix(models) add Points model CompetitionID and userID gorm field tags
joaooliveira247 Mar 28, 2025
bd74a01
feat(models) add CompetitionReport model
joaooliveira247 Mar 28, 2025
09948ee
feat(controllers): add CompetitionsController GetCompetitionReport me…
joaooliveira247 Mar 28, 2025
305072a
feat(repositories): add CompetitionsRepository GetCompetitionByID method
joaooliveira247 Mar 28, 2025
994b523
feat(controllers): add CompetitionsController GetCompetitionReport me…
joaooliveira247 Mar 28, 2025
b94e794
feat(routes): add /reports/ route in CompetitionRoute
joaooliveira247 Mar 28, 2025
89b1008
chore(package): add github.com/aws/aws-sdk-go-v2
joaooliveira247 Mar 28, 2025
20369f7
chore(package): add github.com/aws/aws-sdk-go-v2/config
joaooliveira247 Mar 28, 2025
b301f52
chore(package): add github.com/aws/aws-sdk-go-v2/service/ses
joaooliveira247 Mar 28, 2025
9205d1e
chore(package): remove aws packages
joaooliveira247 Mar 28, 2025
4569299
chore(package): add gopkg.in/gomail.v2
joaooliveira247 Mar 28, 2025
2e53676
feat(services) add SendEmail service
joaooliveira247 Mar 28, 2025
8ee59e9
feat(controllers): add SendEmail in GetCompetition method
joaooliveira247 Mar 28, 2025
585e4dd
feat(config): add SERVICE_EMAIL var
joaooliveira247 Mar 28, 2025
9a05a39
feat(config): add PASSWORD_SERVICE_EMAIL var
joaooliveira247 Mar 28, 2025
5ffb57b
chore(docker) add SERVICE_EMAIL and PASSWORD_SERVICE_EMAIL env vars i…
joaooliveira247 Mar 28, 2025
c8b47f6
feat(controllers): add SendEmail in CloseCompetition method
joaooliveira247 Mar 28, 2025
9efc375
docs(requirements): add requeriments section
joaooliveira247 Mar 29, 2025
3e3e71f
docs(documentation): add documentation section
joaooliveira247 Mar 29, 2025
2e05d4e
docs(packages): add Usage libraries section
joaooliveira247 Mar 29, 2025
c0d10ff
docs(database): add database diagram
joaooliveira247 Mar 29, 2025
1cab5e1
chore(package): add golang.org/x/time/rate
joaooliveira247 Mar 29, 2025
9bd0f9e
feat(middlewares): add limiters var
joaooliveira247 Mar 29, 2025
be2e98f
feat(middlewares): add getLimiter func
joaooliveira247 Mar 29, 2025
a4cf5dd
feat(middlewares): add RateLimiter func
joaooliveira247 Mar 29, 2025
224f4c2
feat(main): add RateLimiter in gin api
joaooliveira247 Mar 29, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# If you prefer the allow list template instead of the deny list, see community template:
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
#
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib

# Test binary, built with `go test -c`
*.test

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# Dependency directories (remove the comment below to include it)
# vendor/

# Go workspace file
go.work
go.work.sum

# env file
.env

# tmp files
tmp/

#React gitignore

.idea/
.vscode/
node_modules/
build
.DS_Store
*.tgz
my-app*
template/src/__tests__/__snapshots__/
lerna-debug.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
/.changelog
.npm/
yarn.lock
10 changes: 10 additions & 0 deletions backend/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
FROM golang:1.24.1-alpine3.21

WORKDIR /app

RUN go install github.com/air-verse/air@latest

COPY . .
RUN go mod download

CMD ["air", "run"]
265 changes: 265 additions & 0 deletions backend/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,265 @@
# 🏭 Carbon Offset API

![GitHub go.mod Go version](https://img.shields.io/github/go-mod/go-version/joaooliveira247/backend-test/dev/backend)

## 💻 Requirements:

### `Go >= 1.24.1`

### [`Docker`](https://www.docker.com/) & [`Docker compose`](https://docs.docker.com/compose/)

## 📜 Documentation:

`/users/`

<details>
<summary><code>POST /users/</code></summary>

- **Description**: Creates a new user.

- **Headers**:

```plaintext
Content-Type: application/json

```

- **Request Body**:

```json
{
"name": "john",
"email": "john@gmail.com",
"phone": "+5519912345678"
}
```

- **Success Response (201 Created)**:

```json
{
"affiliateCode": "1d47bbe5-c7d3-4580-ad2a-c4b192eeeb47"
}
```

- **Errors**:

- **400 Bad Request**: Invalid request body.

- **500 Internal Server Error**: Failed to create the entity.

- **Example Request with cURL**:

```curl
curl -X POST localhost:8000/users/ \
-H "Content-Type: application/json" \
-d '{
"name": "john",
"email": "john@gmail.com",
"phone": "+5519912345678"
}'
```
</details>

###

`/competitions/`

<details>
<summary><code>POST /competitions/</code></summary>

- **Description**: Creates a new competition.

- **Headers**:

```plaintext
Content-Type: application/json

```

- **Request Body**:

```json
```

- **Success Response (201 Created)**:

```json
{
"id": "06ae5f86-46dd-42d3-8e6d-2abe26f6b07e"
}
```

- **Errors**:

- **409 Conflict**: competition already activated.

- **500 Internal Server Error**: error create competition.

- **Example Request with cURL**:

```curl
curl -X POST localhost:8000/competitions/ \
-H "Content-Type: application/json" \
```
</details>

<details>
<summary><code>GET /competitions/</code></summary>

- **Description**: Get competition activated.

- **Headers**:

```plaintext
Content-Type: application/json

```

- **Success Response (200 OK / 204 No Content)**:

```json
{
"id": "9fbae8ae-3ba9-4582-a931-04d2e3c6aa93",
"createdAt": 1743096181,
"status": true
}
```

- **Example Request with cURL**:

```curl
curl -X GET localhost:8000/competitions/ \
-H "Content-Type: application/json" \
```
</details>

<details>
<summary><code>PUT /competitions/</code></summary>

- **Description**: Close Competition.

- **Headers**:

```plaintext
Content-Type: application/json

```

- **Query Parameters**:

**ID** (required, UUID): Competiton ID.

- **Request Body**:

```json
```

- **Success Response (204 No Content)**:

```json
```

- **Errors**:

- **400 Bad Request**: invalid id.

- **404 Not Found**: competition not found.

- **409 Conflict**: competition already activated.

- **500 Internal Server Error**: closed competition error.

- **Example Request with cURL**:

```curl
curl -X PUT localhost:8000/competitions/?ID=e4b5c0cc-2f47-4b29-9883-84f314600f71\
-H "Content-Type: application/json" \
```
</details>

<details>
<summary><code>GET /competitions/reports/</code></summary>

- **Description**: Get competition reports.

- **Headers**:

```plaintext
Content-Type: application/json
```

- **Query Parameters**:

**ID** (required, UUID): Competiton ID.

- **Success Response (200 OK)**:

```json
[
{
"name": "User 6",
"points": 10
},
{
"name": "User 5",
"points": 10
},
{
"name": "User 13",
"points": 9
},
{
"name": "User 8",
"points": 8
},
{
"name": "User 9",
"points": 8
},
{
"name": "User 7",
"points": 6
},
{
"name": "User 2",
"points": 4
},
{
"name": "User 11",
"points": 4
},
{
"name": "User 15",
"points": 4
},
{
"name": "User 1",
"points": 2
}
]
```

- **Example Request with cURL**:

```curl
curl -X GET localhost:8000/competitions/reports/?ID=d3dd9c62-5cc0-4b57-b341-ea1876dadac6 \
-H "Content-Type: application/json" \
```
</details>

## 🗄️ Database Diagram

![database_diagram](https://i.imgur.com/CaK8HUN.png)

## 📦 Usage libraries:

- [gin](github.com/gin-gonic/gin)

- [gorm](https://gorm.io/)

- [gorm/postgres](https://github.com/go-gorm/postgres)

- [uuid](github.com/google/uuid)

- [gomail](https://pkg.go.dev/gopkg.in/gomail.v2?utm_source=godoc)
50 changes: 50 additions & 0 deletions backend/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
module github.com/joaooliveira247/backend-test

go 1.24.1

require (
github.com/gin-gonic/gin v1.10.0
github.com/google/uuid v1.6.0
gorm.io/driver/postgres v1.5.11
gorm.io/gorm v1.25.12
)

require (
github.com/bytedance/sonic v1.13.2 // indirect
github.com/bytedance/sonic/loader v0.2.4 // indirect
github.com/cloudwego/base64x v0.1.5 // indirect
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
github.com/gin-contrib/sse v1.0.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.25.0 // indirect
github.com/goccy/go-json v0.10.5 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/pgx/v5 v5.7.4 // indirect
github.com/jackc/puddle/v2 v2.2.2 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
golang.org/x/arch v0.15.0 // indirect
golang.org/x/crypto v0.36.0 // indirect
golang.org/x/net v0.37.0 // indirect
golang.org/x/sync v0.12.0 // indirect
golang.org/x/sys v0.31.0 // indirect
golang.org/x/text v0.23.0 // indirect
golang.org/x/time v0.11.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
Loading