Compare commits
5 Commits
99d035c915
...
65838bac74
| Author | SHA1 | Date | |
|---|---|---|---|
| 65838bac74 | |||
| 01dc6bb462 | |||
| a82adb90c2 | |||
| 6f419ece3d | |||
| 56209011ec |
20
Dockerfile
Normal file
20
Dockerfile
Normal file
@@ -0,0 +1,20 @@
|
||||
FROM golang:1.25.3-alpine AS builder
|
||||
|
||||
WORKDIR /app
|
||||
COPY . .
|
||||
|
||||
# Build
|
||||
RUN go mod download
|
||||
RUN CGO_ENABLED=0 GOOS=linux go build -a -o main ./cmd/server
|
||||
###########
|
||||
|
||||
FROM alpine:3.22.2
|
||||
|
||||
RUN apk --no-cache add ca-certificates
|
||||
WORKDIR /root/
|
||||
|
||||
# Copy the pre-built binary
|
||||
COPY --from=builder /app/main .
|
||||
|
||||
EXPOSE 8080
|
||||
CMD ["./main"]
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
_ "gitea.gabilandia.com/gabdlr/agenda-web-go/docs"
|
||||
"gitea.gabilandia.com/gabdlr/agenda-web-go/internal/database"
|
||||
"gitea.gabilandia.com/gabdlr/agenda-web-go/internal/handler"
|
||||
"gitea.gabilandia.com/gabdlr/agenda-web-go/internal/middleware"
|
||||
"gitea.gabilandia.com/gabdlr/agenda-web-go/internal/repository"
|
||||
httpSwagger "github.com/swaggo/http-swagger"
|
||||
)
|
||||
@@ -17,12 +18,12 @@ import (
|
||||
// @termsOfService http://swagger.io/terms/
|
||||
|
||||
// @contact.name API Support
|
||||
// @contact.email support@yourapp.com
|
||||
// @contact.email gabriel.delosrios@tutamail.com
|
||||
|
||||
// @license.name MIT
|
||||
// @license.url https://opensource.org/licenses/MIT
|
||||
|
||||
// @host localhost:8080
|
||||
// @host agenda-web-go.gabilandia.com
|
||||
// @BasePath /
|
||||
func main() {
|
||||
err := database.InitDB()
|
||||
@@ -36,5 +37,5 @@ func main() {
|
||||
handler.HandleContacts(mux, contactRepo)
|
||||
handler.HandlHealthChecks(mux)
|
||||
mux.HandleFunc("/swagger/", httpSwagger.WrapHandler)
|
||||
log.Fatal(http.ListenAndServe(":8080", mux))
|
||||
log.Fatal(http.ListenAndServe(":8080", middleware.CorsMiddleware(mux)))
|
||||
}
|
||||
|
||||
23
docker-compose.yml
Normal file
23
docker-compose.yml
Normal file
@@ -0,0 +1,23 @@
|
||||
services:
|
||||
go-app:
|
||||
build: .
|
||||
container_name: agenda-web-go
|
||||
environment:
|
||||
- DB_NAME=${DB_NAME}
|
||||
- DB_USER=${DB_USER}
|
||||
- DB_PASSWORD=${DB_PASSWORD}
|
||||
- DB_HOST=${DB_HOST}
|
||||
- DB_PORT=${DB_PORT}
|
||||
- ALLOWED_ORIGIN=${ALLOWED_ORIGIN}
|
||||
networks:
|
||||
- db-network
|
||||
volumes:
|
||||
#- ./cache:/root/.cache
|
||||
- ./:/app
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 3005:8080
|
||||
|
||||
networks:
|
||||
db-network:
|
||||
external: true
|
||||
@@ -12,7 +12,7 @@ const docTemplate = `{
|
||||
"termsOfService": "http://swagger.io/terms/",
|
||||
"contact": {
|
||||
"name": "API Support",
|
||||
"email": "support@yourapp.com"
|
||||
"email": "gabriel.delosrios@tutamail.com"
|
||||
},
|
||||
"license": {
|
||||
"name": "MIT",
|
||||
@@ -364,7 +364,7 @@ const docTemplate = `{
|
||||
// SwaggerInfo holds exported Swagger Info so clients can modify it
|
||||
var SwaggerInfo = &swag.Spec{
|
||||
Version: "1.0",
|
||||
Host: "localhost:8080",
|
||||
Host: "agenda-web-go.gabilandia.com",
|
||||
BasePath: "/",
|
||||
Schemes: []string{},
|
||||
Title: "Contacts API",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"termsOfService": "http://swagger.io/terms/",
|
||||
"contact": {
|
||||
"name": "API Support",
|
||||
"email": "support@yourapp.com"
|
||||
"email": "gabriel.delosrios@tutamail.com"
|
||||
},
|
||||
"license": {
|
||||
"name": "MIT",
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
"version": "1.0"
|
||||
},
|
||||
"host": "localhost:8080",
|
||||
"host": "agenda-web-go.gabilandia.com",
|
||||
"basePath": "/",
|
||||
"paths": {
|
||||
"/contacts": {
|
||||
|
||||
@@ -47,10 +47,10 @@ definitions:
|
||||
description: Phone number in international format
|
||||
type: string
|
||||
type: object
|
||||
host: localhost:8080
|
||||
host: agenda-web-go.gabilandia.com
|
||||
info:
|
||||
contact:
|
||||
email: support@yourapp.com
|
||||
email: gabriel.delosrios@tutamail.com
|
||||
name: API Support
|
||||
description: A simple Contacts CRUD API
|
||||
license:
|
||||
|
||||
@@ -87,9 +87,7 @@ func ensureTablesExist() error {
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
name VARCHAR(120) NOT NULL,
|
||||
company VARCHAR(120) NOT NULL,
|
||||
phone VARCHAR(15) NOT NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
phone VARCHAR(15) NOT NULL
|
||||
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
`)
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ type APIResponse struct {
|
||||
// Indicates if the request was successful
|
||||
Success bool `json:"success"`
|
||||
// The response data
|
||||
Data any `json:"data,omitempty"`
|
||||
Data any `json:"data"`
|
||||
// List of errors if any occurred
|
||||
Errors []APIError `json:"errors,omitempty"`
|
||||
// Optional message
|
||||
|
||||
19
internal/middleware/cors.go
Normal file
19
internal/middleware/cors.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"os"
|
||||
)
|
||||
|
||||
func CorsMiddleware(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Access-Control-Allow-Origin", os.Getenv("ALLOWED_ORIGIN"))
|
||||
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
|
||||
w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
|
||||
if r.Method == "OPTIONS" {
|
||||
w.WriteHeader(http.StatusOK)
|
||||
return
|
||||
}
|
||||
next.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user