aboutsummaryrefslogtreecommitdiffhomepage
path: root/backend/gen/api_handler_wrapper_gen.go
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2024-08-08 00:40:22 +0900
committernsfisis <nsfisis@gmail.com>2024-08-08 04:02:37 +0900
commitc173778cefd66e5259ad75c9399a95c03ce5fa91 (patch)
tree3990ed2d9985e6cbe3ec1a47ef8e5abeb1010cec /backend/gen/api_handler_wrapper_gen.go
parentcfe46bf104dec03c81ca38eb6b6a23b372a271b6 (diff)
downloadiosdc-japan-2024-albatross-c173778cefd66e5259ad75c9399a95c03ce5fa91.tar.gz
iosdc-japan-2024-albatross-c173778cefd66e5259ad75c9399a95c03ce5fa91.tar.zst
iosdc-japan-2024-albatross-c173778cefd66e5259ad75c9399a95c03ce5fa91.zip
refactor(backend): organize gen/ directory
Diffstat (limited to 'backend/gen/api_handler_wrapper_gen.go')
-rw-r--r--backend/gen/api_handler_wrapper_gen.go168
1 files changed, 0 insertions, 168 deletions
diff --git a/backend/gen/api_handler_wrapper_gen.go b/backend/gen/api_handler_wrapper_gen.go
deleted file mode 100644
index 7fd34b2..0000000
--- a/backend/gen/api_handler_wrapper_gen.go
+++ /dev/null
@@ -1,168 +0,0 @@
-package main
-
-import (
- "bytes"
- "flag"
- "go/ast"
- "go/format"
- "go/parser"
- "go/token"
- "os"
- "slices"
- "strings"
- "text/template"
-)
-
-func main() {
- inputFile := flag.String("i", "", "input file")
- outputFile := flag.String("o", "", "output file")
- flag.Parse()
-
- if inputFile == nil || *inputFile == "" || outputFile == nil || *outputFile == "" {
- flag.PrintDefaults()
- os.Exit(1)
- }
-
- // Parse the input file
- fileSet := token.NewFileSet()
- parsedFile, err := parser.ParseFile(fileSet, *inputFile, nil, parser.SkipObjectResolution)
- if err != nil {
- panic(err)
- }
-
- // Find methods in StrictServerInterface
- var methods []string
- for _, decl := range parsedFile.Decls {
- genDecl, ok := decl.(*ast.GenDecl)
- if !ok {
- continue
- }
- for _, spec := range genDecl.Specs {
- typeSpec, ok := spec.(*ast.TypeSpec)
- if !ok {
- continue
- }
- if typeSpec.Name.Name != "StrictServerInterface" {
- continue
- }
- interfaceType, ok := typeSpec.Type.(*ast.InterfaceType)
- if !ok {
- continue
- }
- for _, method := range interfaceType.Methods.List {
- if len(method.Names) != 0 {
- methods = append(methods, method.Names[0].Name)
- }
- }
- }
- }
- if len(methods) == 0 {
- panic("StrictServerInterface not found")
- }
- slices.Sort(methods)
-
- type TemplateParameter struct {
- Name string
- RequiresLogin bool
- RequiresAdminRole bool
- }
- templateParameters := make([]TemplateParameter, len(methods))
- for i, method := range methods {
- templateParameters[i] = TemplateParameter{
- Name: method,
- RequiresLogin: method != "PostLogin",
- RequiresAdminRole: strings.Contains(method, "Admin"),
- }
- }
-
- // Generate code.
- tmpl, err := template.New("code").Parse(templateText)
- if err != nil {
- panic(err)
- }
-
- var buf bytes.Buffer
- err = tmpl.Execute(&buf, templateParameters)
- if err != nil {
- panic(err)
- }
-
- formatted, err := format.Source(buf.Bytes())
- if err != nil {
- panic(err)
- }
-
- err = os.WriteFile(*outputFile, formatted, 0644)
- if err != nil {
- panic(err)
- }
-}
-
-const templateText = `// Code generated by go generate; DO NOT EDIT.
-
-package api
-
-import (
- "context"
- "errors"
- "strings"
-
- "github.com/nsfisis/iosdc-japan-2024-albatross/backend/auth"
- "github.com/nsfisis/iosdc-japan-2024-albatross/backend/db"
-)
-
-var _ StrictServerInterface = (*ApiHandlerWrapper)(nil)
-
-type ApiHandlerWrapper struct {
- innerHandler ApiHandler
-}
-
-func NewHandler(queries *db.Queries, hubs GameHubsInterface) *ApiHandlerWrapper {
- return &ApiHandlerWrapper{
- innerHandler: ApiHandler{
- q: queries,
- hubs: hubs,
- },
- }
-}
-
-func parseJWTClaimsFromAuthorizationHeader(authorization string) (*auth.JWTClaims, error) {
- const prefix = "Bearer "
- if !strings.HasPrefix(authorization, prefix) {
- return nil, errors.New("invalid authorization header")
- }
- token := authorization[len(prefix):]
- claims, err := auth.ParseJWT(token)
- if err != nil {
- return nil, err
- }
- return claims, nil
-}
-
-{{ range . }}
- func (h *ApiHandlerWrapper) {{ .Name }}(ctx context.Context, request {{ .Name }}RequestObject) ({{ .Name }}ResponseObject, error) {
- {{ if .RequiresLogin -}}
- user, err := parseJWTClaimsFromAuthorizationHeader(request.Params.Authorization)
- if err != nil {
- return {{ .Name }}401JSONResponse{
- UnauthorizedJSONResponse: UnauthorizedJSONResponse{
- Message: "Unauthorized",
- },
- }, nil
- }
- {{ if .RequiresAdminRole -}}
- if !user.IsAdmin {
- return {{ .Name }}403JSONResponse{
- ForbiddenJSONResponse: ForbiddenJSONResponse{
- Message: "Forbidden",
- },
- }, nil
- }
- {{ end -}}
- return h.innerHandler.{{ .Name }}(ctx, request, user)
- {{ else -}}
- return h.innerHandler.{{ .Name }}(ctx, request)
- {{ end -}}
- }
-{{ end }}
-`