diff --git a/.gitignore b/.gitignore index 41b66b9..f344e37 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ secret-santa +*.db \ No newline at end of file diff --git a/dbconfig.yml b/dbconfig.yml index 5bf6db9..4ab94f3 100644 --- a/dbconfig.yml +++ b/dbconfig.yml @@ -1,4 +1,4 @@ development: dialect: sqlite3 datasource: test.db - dir: migrations/ + dir: sql/migrations/ diff --git a/internal/queries/models.go b/internal/queries/models.go index d87ba4c..777bf4e 100644 --- a/internal/queries/models.go +++ b/internal/queries/models.go @@ -5,8 +5,8 @@ package queries type User struct { - ID int64 - FirstName string - LastName string - Email string + ID int64 `json:"id"` + FirstName string `json:"first_name"` + LastName string `json:"last_name"` + Email string `json:"email"` } diff --git a/internal/queries/user.sql.go b/internal/queries/user.sql.go index 543c51d..d9f6305 100644 --- a/internal/queries/user.sql.go +++ b/internal/queries/user.sql.go @@ -14,9 +14,9 @@ INSERT INTO users (id, email, first_name, last_name) VALUES (NULL, ?, ?, ?) ` type CreateUserParams struct { - Email string - FirstName string - LastName string + Email string `json:"email"` + FirstName string `json:"first_name"` + LastName string `json:"last_name"` } func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) error { diff --git a/internal/types/response.go b/internal/types/response.go new file mode 100644 index 0000000..4de6b9b --- /dev/null +++ b/internal/types/response.go @@ -0,0 +1,9 @@ +package types + +type JsonResponse[T any] struct { + Data T `json:"data"` +} + +type ErrorResponse struct { + Message string `json:"message"` +} diff --git a/main.go b/main.go index 91c73ee..2761722 100644 --- a/main.go +++ b/main.go @@ -3,36 +3,49 @@ package main import ( "context" "database/sql" - "fmt" + "encoding/json" "log" + "net/http" "git.katuwoss.dev/JustScreaMy/secret-santa/internal/queries" + "git.katuwoss.dev/JustScreaMy/secret-santa/internal/types" _ "github.com/mattn/go-sqlite3" ) +var dbConnection *sql.DB + +func init() { + var err error + dbConnection, err = sql.Open("sqlite3", "./test.db") + if err != nil { + log.Fatal(err) + } + log.Println("Database sucessfully connected") +} + func main() { ctx := context.Background() - dbConnection, err := sql.Open("sqlite3", "./test.db") - if err != nil { - log.Fatal(err) - } - db := queries.New(dbConnection) + log.Println("Created database connection") - if err := db.CreateUser(ctx, queries.CreateUserParams{ - Email: "jakub.kropacek@olc.cz", - FirstName: "Jakub", - LastName: "Kropáček", - }); err != nil { - log.Fatal(err) - } + router := http.NewServeMux() - users, err := db.GetUsers(ctx) - if err != nil { - log.Fatal(err) - } + router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + query := queries.New(dbConnection) - for _, user := range users { - fmt.Println(user) - } + w.Header().Set("Content-Type", "application/json") + users, err := query.GetUsers(ctx) + if err != nil { + w.WriteHeader(404) + log.Printf("Failed to get all users: %s\n", err.Error()) + json.NewEncoder(w).Encode(types.ErrorResponse{Message: err.Error()}) + return + } + if len(users) == 0 { + users = make([]queries.User, 0) + } + json.NewEncoder(w).Encode(types.JsonResponse[[]queries.User]{Data: users}) + }) + + log.Fatal(http.ListenAndServe(":8080", router)) } diff --git a/migrations/20241114201119-initial.sql b/sql/migrations/20241114201119-initial.sql similarity index 87% rename from migrations/20241114201119-initial.sql rename to sql/migrations/20241114201119-initial.sql index e6acc53..930ed84 100644 --- a/migrations/20241114201119-initial.sql +++ b/sql/migrations/20241114201119-initial.sql @@ -1,6 +1,6 @@ -- +migrate Up CREATE TABLE users ( - id INT PRIMARY KEY, + id INTEGER PRIMARY KEY, first_name VARCHAR(64) NOT NULL, last_name VARCHAR(64) NOT NULL, email VARCHAR(128) NOT NULL diff --git a/queries/user.sql b/sql/queries/user.sql similarity index 100% rename from queries/user.sql rename to sql/queries/user.sql diff --git a/sqlc.yaml b/sqlc.yaml index 255f358..79a7f0b 100644 --- a/sqlc.yaml +++ b/sqlc.yaml @@ -1,9 +1,10 @@ version: "2" sql: - engine: sqlite - queries: queries/ - schema: migrations/ + queries: sql/queries/ + schema: sql/migrations/ gen: go: package: "queries" - out: "internal/queries" \ No newline at end of file + out: "internal/queries" + emit_json_tags: true \ No newline at end of file