Loggest thine Stuff
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
4.4 KiB

  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "git.aiterp.net/stufflog3/stufflog3/ports/cognitoauth"
  6. "git.aiterp.net/stufflog3/stufflog3/ports/httpapi"
  7. "git.aiterp.net/stufflog3/stufflog3/ports/mysql"
  8. "git.aiterp.net/stufflog3/stufflog3/usecases/auth"
  9. "git.aiterp.net/stufflog3/stufflog3/usecases/items"
  10. "git.aiterp.net/stufflog3/stufflog3/usecases/projects"
  11. "git.aiterp.net/stufflog3/stufflog3/usecases/scopes"
  12. "git.aiterp.net/stufflog3/stufflog3/usecases/sprints"
  13. "git.aiterp.net/stufflog3/stufflog3/usecases/stats"
  14. "github.com/aws/aws-lambda-go/events"
  15. "github.com/aws/aws-lambda-go/lambda"
  16. ginadapter "github.com/awslabs/aws-lambda-go-api-proxy/gin"
  17. "github.com/gin-gonic/gin"
  18. "log"
  19. "os"
  20. "os/signal"
  21. "strconv"
  22. "syscall"
  23. )
  24. var flagLocal = flag.Bool("local", false, "If set, run locally")
  25. func main() {
  26. flag.Parse()
  27. db, err := mysql.Connect(
  28. os.Getenv("STUFFLOG3_MYSQL_HOST"),
  29. envInt("STUFFLOG3_MYSQL_PORT"),
  30. os.Getenv("STUFFLOG3_MYSQL_USERNAME"),
  31. os.Getenv("STUFFLOG3_MYSQL_PASSWORD"),
  32. os.Getenv("STUFFLOG3_MYSQL_SCHEMA"),
  33. )
  34. if err != nil {
  35. log.Println("Failed to open database:", err)
  36. os.Exit(1)
  37. }
  38. cognitoAuth, err := cognitoauth.New(
  39. os.Getenv("STUFFLOG3_AWS_REGION"),
  40. os.Getenv("STUFFLOG3_AWS_CLIENT_ID"),
  41. os.Getenv("STUFFLOG3_AWS_CLIENT_SECRET"),
  42. os.Getenv("STUFFLOG3_AWS_POOL_ID"),
  43. os.Getenv("STUFFLOG3_AWS_POOL_CLIENT_ID"),
  44. os.Getenv("STUFFLOG3_AWS_POOL_CLIENT_SECRET"),
  45. )
  46. if err != nil {
  47. log.Println("Failed to setup cognito:", err)
  48. os.Exit(1)
  49. }
  50. authService := &auth.Service{
  51. Provider: cognitoAuth,
  52. }
  53. scopesService := &scopes.Service{
  54. Auth: authService,
  55. Repository: db.Scopes(),
  56. StatsLister: db.Stats(),
  57. }
  58. statsService := &stats.Service{
  59. Scopes: scopesService,
  60. Repository: db.Stats(),
  61. }
  62. itemsService := &items.Service{
  63. Auth: authService,
  64. Scopes: scopesService,
  65. Stats: statsService,
  66. Repository: db.Items(),
  67. RequirementFetcher: db.Projects(),
  68. ProjectFetcher: db.Projects(),
  69. }
  70. projectsService := &projects.Service{
  71. Auth: authService,
  72. Scopes: scopesService,
  73. Stats: statsService,
  74. Items: itemsService,
  75. Repository: db.Projects(),
  76. }
  77. sprintsService := &sprints.Service{
  78. Scopes: scopesService,
  79. Items: itemsService,
  80. Projects: projectsService,
  81. Repository: db.Sprints(),
  82. }
  83. server := gin.New()
  84. httpapi.Auth(server.Group("/api/v1/auth"), authService)
  85. apiV1 := server.Group("/api/v1")
  86. if os.Getenv("STUFFLOG3_USE_DUMMY_USER") == "true" {
  87. log.Println("Using dummy UUID")
  88. apiV1.Use(httpapi.DummyMiddleware(authService, "c11230be-4912-4313-83b0-410a248b5bd1"))
  89. } else {
  90. apiV1.Use(httpapi.JwtValidatorMiddleware(authService))
  91. }
  92. apiV1Scopes := apiV1.Group("/scopes")
  93. httpapi.Scopes(apiV1Scopes, scopesService)
  94. apiV1ScopesSub := apiV1Scopes.Group("/:scope_id")
  95. apiV1ScopesSub.Use(httpapi.ScopeMiddleware(scopesService, authService))
  96. httpapi.Projects(apiV1ScopesSub.Group("/projects"), projectsService)
  97. httpapi.Requirements(apiV1ScopesSub.Group("/requirements"), projectsService)
  98. httpapi.Items(apiV1ScopesSub.Group("/items"), itemsService)
  99. httpapi.Sprints(apiV1ScopesSub.Group("/sprints"), sprintsService)
  100. httpapi.Stats(apiV1ScopesSub.Group("/stats"), statsService)
  101. apiV1AllScopes := apiV1.Group("/all-scopes")
  102. apiV1AllScopes.Use(httpapi.AllScopeMiddleware(scopesService, authService))
  103. httpapi.ItemsAllScopes(apiV1AllScopes.Group("/items"), itemsService)
  104. httpapi.SprintsAllScopes(apiV1AllScopes.Group("/sprints"), sprintsService)
  105. httpapi.RequirementsAllScopes(apiV1AllScopes.Group("/requirements"), projectsService)
  106. if *flagLocal {
  107. exitSignal := make(chan os.Signal)
  108. signal.Notify(exitSignal, os.Interrupt, os.Kill, syscall.SIGTERM)
  109. errCh := make(chan error)
  110. go func() {
  111. err := server.Run(":8239")
  112. if err != nil {
  113. errCh <- err
  114. }
  115. }()
  116. select {
  117. case sig := <-exitSignal:
  118. {
  119. log.Println("Received signal", sig)
  120. os.Exit(0)
  121. }
  122. case err := <-errCh:
  123. {
  124. log.Println("Server run failed:", err)
  125. os.Exit(2)
  126. }
  127. }
  128. } else {
  129. ginLambda := ginadapter.New(server)
  130. lambda.Start(func(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
  131. return ginLambda.ProxyWithContext(ctx, request)
  132. })
  133. }
  134. }
  135. func envInt(key string) int {
  136. value := os.Getenv(key)
  137. if value == "" {
  138. return 0
  139. }
  140. intValue, err := strconv.Atoi(value)
  141. if err != nil {
  142. return 0
  143. }
  144. return intValue
  145. }