Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
85196f0
Fix response
version-1 Sep 25, 2024
78cf3ae
Add table test helper to testing package
version-1 Sep 26, 2024
7b85baf
Add jsonapi adapter test
version-1 Sep 26, 2024
a340f94
[pkg/logger] add log level to logger
version-1 Sep 27, 2024
e6394f3
[pkg/presenter/jsonapi] add id check
version-1 Sep 27, 2024
68bad1a
fix test
version-1 Sep 27, 2024
56f0be5
[pkg/presenter/jsonapi] add json escape
version-1 Sep 27, 2024
c052728
[pkg/presenter/jsonapi] fix stringify
version-1 Sep 27, 2024
c1a73b0
[pkg/http/request] add query method
version-1 Sep 27, 2024
7e61744
[pkg/http/response] add test to render with meta
version-1 Sep 27, 2024
47779f5
[pkg/presenter/jsonapi] add shouldSort params to Resources
version-1 Sep 27, 2024
ab9344f
[pkg/presenter/adapter] change content type
version-1 Sep 27, 2024
41e8f25
[pkg/presenter/adapter] minify json response
version-1 Sep 27, 2024
5482790
[pkg/logger] fix log level
version-1 Sep 27, 2024
0183f42
[pkg/controller] Add Insert method to Middlewares
version-1 Sep 27, 2024
6c0e62d
[pkg/payload] env var payload
version-1 Sep 28, 2024
c3a6116
[pkg/payload] fix env file loader
version-1 Sep 29, 2024
e383028
[pkg/command/migration] add migration gen command
version-1 Sep 30, 2024
77e6fbf
[command/migration] update field name for null
version-1 Oct 2, 2024
bb5bf3d
[pkg/schema] add parser with ast/go to schema
version-1 Oct 3, 2024
8b11e86
[pkg/schema] update schema
version-1 Oct 4, 2024
740ca1d
[pkg/schema] organize dirs
version-1 Oct 5, 2024
79e63fe
Merge pull request #6 from version-1/feature/update-schema
version-1 Oct 5, 2024
4d30207
[pkg/schema] organize dirs
version-1 Oct 5, 2024
112e4df
[pkg/schema] add migration generator
version-1 Oct 5, 2024
df36842
Merge pull request #7 from version-1/feature/schema-migration
version-1 Oct 6, 2024
b9e8750
initial commit for v0.1.0
version-1 Dec 14, 2024
a4312dc
Add Walk func for route group
version-1 Dec 15, 2024
4f80ab9
Fix for nested routes
version-1 Dec 15, 2024
7645e1f
Fix for post endpoint
version-1 Dec 15, 2024
ca60513
Add swagger endpoint
version-1 Dec 22, 2024
7ff8c56
Add schemav2 package
version-1 Jan 4, 2025
8d8d6f3
Impl gen main.go code
version-1 Jan 4, 2025
3066f6d
Impl schema generation
version-1 Feb 9, 2025
9bca22b
Move up command pkg
version-1 Feb 9, 2025
94890b9
Replace existing schema pkg with new one
version-1 Feb 9, 2025
709b2ea
make api & datasource dir
version-1 Feb 9, 2025
82d535b
Add ordedMap for persist order
version-1 Feb 9, 2025
067abd6
Organize test
version-1 Feb 9, 2025
a190500
Add branch for ci
version-1 Feb 9, 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
48 changes: 3 additions & 45 deletions .github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ on:
- develop
- 'feature/*'
- 'releases/*'
- 'v0.1.0-20240104'
jobs:
test-packages:
runs-on: ubuntu-latest
Expand Down Expand Up @@ -39,50 +40,7 @@ jobs:
run: apk add --update-cache git
- name: Init Database
run: go run test/cmd/initdb/main.go
- name: Go mod tidy
run: go mod tidy
- name: Run tests
run: go test -v ./pkg/...
run-examples:
runs-on: ubuntu-latest
container:
image: golang:1.22-alpine3.20
defaults:
run:
shell: sh
env:
ENV: test
DATABASE_URL: postgres://gooo:password@db:5432/gooo_test?sslmode=disable
services:
db:
image: postgres:16.2
env:
POSTGRES_USER: gooo
POSTGRES_PASSWORD: password
POSTGRES_DB: gooo_test
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
steps:
- name: Check out repository code
uses: actions/checkout@v4
- name: Install dependencies
run: apk add --update-cache git
- name: Init Database
run: go run test/cmd/initdb/main.go
# - name: Run API
# run: go run examples/starter/cmd/api/main.go
- name: Run Scheme
run: go run examples/starter/cmd/schema/main.go examples/starter/models
- name: Run Seed
run: go run examples/starter/cmd/seed/main.go
- name: Run Migration Up
env:
MIGRATION_PATH: examples/starter/db/migrations/*.sql
run: go run examples/starter/cmd/migration/main.go up
- name: Run Migration Down
env:
MIGRATION_PATH: examples/starter/db/migrations/*.sql
run: go run examples/starter/cmd/migration/main.go down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Go Full Stack Framework
### Features

- App
- HHTTP Server
- HTTP Server
- Controller
- Middleware
- CORS
Expand Down
111 changes: 111 additions & 0 deletions examples/bare/cmd/app.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package main

import (
"context"
"log"
"net/http"
"time"

"github.com/version-1/gooo/examples/bare/internal/swagger"
"github.com/version-1/gooo/pkg/core/api/app"
"github.com/version-1/gooo/pkg/core/api/request"
"github.com/version-1/gooo/pkg/core/api/response"
"github.com/version-1/gooo/pkg/core/api/route"
"github.com/version-1/gooo/pkg/toolkit/logger"
"github.com/version-1/gooo/pkg/toolkit/middleware"
)

type User struct {
ID string `json:"id"`
Username string `json:"name"`
Email string `json:"email"`
Created time.Time `json:"created"`
Updated time.Time `json:"updated"`
}

type UserCreate struct {
Username string `json:"name"`
Email string `json:"email"`
}

func main() {
cfg := &app.Config{}
cfg.SetLogger(logger.DefaultLogger)

server := &app.App{
Addr: ":8080",
Config: cfg,
ErrorHandler: func(w http.ResponseWriter, r *http.Request, err error) {
cfg.Logger().Errorf("Error: %+v", err)
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte("Internal server error"))
},
}

users := route.GroupHandler{
Path: "/users",
Handlers: []route.HandlerInterface{
route.JSON[request.Void, map[string]string]().Get("", func(res *response.Response[map[string]string], req *request.Request[request.Void]) {
res.Render(map[string]string{"message": "ok"})
}),
route.JSON[UserCreate, User]().Post("", func(res *response.Response[User], req *request.Request[UserCreate]) {
body, err := req.Body()
if err != nil {
res.BadRequest(err)
return
}

now := time.Now()
user := User{
ID: "1",
Username: body.Username,
Email: body.Email,
Created: now,
Updated: now,
}
res.Render(user)
}),
route.JSON[request.Void, any]().Get(":id", func(res *response.Response[any], req *request.Request[request.Void]) {
res.Render(map[string]string{"message": "ok"})
}),
route.JSON[request.Void, any]().Patch(":id", func(res *response.Response[any], req *request.Request[request.Void]) {
res.Render(map[string]string{"message": "ok"})
}),
route.JSON[request.Void, any]().Delete(":id", func(res *response.Response[any], req *request.Request[request.Void]) {
res.Render(map[string]string{"message": "ok"})
}),
},
}
swagger := route.GroupHandler{
Path: "/swagger",
Handlers: []route.HandlerInterface{
route.HTML[request.Void]().Get("", func(res *response.Response[[]byte], req *request.Request[request.Void]) {
res.Render(swagger.Index())
}),
route.Text[request.Void]().Get("swagger.yml", func(res *response.Response[[]byte], req *request.Request[request.Void]) {
b, err := swagger.SwaggerYAML()
if err != nil {
res.InternalServerError(err)
return
}

res.Render(b)
}),
},
}

apiv1 := route.GroupHandler{
Path: "/api/v1",
}
apiv1.Add(users.Children()...)
apiv1.Add(swagger.Children()...)
app.WithDefaultMiddlewares(server, apiv1.Children()...)
route.Walk(apiv1.Children(), func(h middleware.Handler) {
server.Logger().Infof("%s", h.String())
})

ctx := context.Background()
if err := server.Run(ctx); err != nil {
log.Fatalf("failed to run app: %s", err)
}
}
48 changes: 48 additions & 0 deletions examples/bare/internal/swagger/swagger.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package swagger

import (
"embed"
"fmt"
"io/fs"
)

const hostURL = "http://localhost:8080"

func Index() []byte {
return []byte(fmt.Sprintf(`<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Swagger</title>
<link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5.11.0/swagger-ui.css" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="SwaggerUI" />
</head>
<body>
<div id="swagger-ui"></div>
<script src="https://unpkg.com/swagger-ui-dist@5.11.0/swagger-ui-bundle.js"></script>
<script>
window.onload = () => {
window.ui = SwaggerUIBundle({
url: '%s/api/v1/swagger/swagger.yml',
dom_id: '#swagger-ui',
});
};
</script>
</body>
</html>
`, hostURL))

}

//go:embed *.yml
var swaggerConf embed.FS

func SwaggerYAML() ([]byte, error) {
f, err := fs.ReadFile(swaggerConf, "swagger.yml")
if err != nil {
return f, err
}

return f, nil
}
Loading