Skip to content

Commit

Permalink
refactor: refactor chat overlay to gql, add ability disable animations (
Browse files Browse the repository at this point in the history
#745)

* refactor: refactor chat overlay to gql, and add ability to disable animations

* kruto

* kruto

* kruto

* kruto

* kruto

* kruto
  • Loading branch information
Satont committed Jun 10, 2024
1 parent efea4de commit 68aa301
Show file tree
Hide file tree
Showing 46 changed files with 8,573 additions and 10,226 deletions.
4 changes: 2 additions & 2 deletions apps/api-gql/cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ package main

import (
cfg "github.com/satont/twir/libs/config"
"github.com/twirapp/twir/apps/api-gql/internal/auth"
"github.com/twirapp/twir/apps/api-gql/internal/gql"
"github.com/twirapp/twir/apps/api-gql/internal/gql/directives"
"github.com/twirapp/twir/apps/api-gql/internal/gql/resolvers"
"github.com/twirapp/twir/apps/api-gql/internal/httpserver"
"github.com/twirapp/twir/apps/api-gql/internal/minio"
pubclicroutes "github.com/twirapp/twir/apps/api-gql/internal/routes/public"
"github.com/twirapp/twir/apps/api-gql/internal/routes/webhooks"
"github.com/twirapp/twir/apps/api-gql/internal/sessions"
"github.com/twirapp/twir/apps/api-gql/internal/wsrouter"
"github.com/twirapp/twir/libs/baseapp"
buscore "github.com/twirapp/twir/libs/bus-core"
Expand All @@ -26,7 +26,7 @@ func main() {
fx.New(
baseapp.CreateBaseApp("api-gql"),
fx.Provide(
sessions.New,
auth.NewSessions,
func(config cfg.Config) tokens.TokensClient {
return clients.NewTokens(config.AppEnv)
},
Expand Down
28 changes: 28 additions & 0 deletions apps/api-gql/internal/auth/api_key.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package auth

import (
"context"
"fmt"

model "github.com/satont/twir/libs/gomodels"
"github.com/twirapp/twir/apps/api-gql/internal/gql/gincontext"
)

func (s *Auth) GetAuthenticatedUserByApiKey(ctx context.Context) (*model.Users, error) {
ginCtx, err := gincontext.GetGinContext(ctx)
if err != nil {
return nil, fmt.Errorf("failed to get gin context: %w", err)
}

apiKey := ginCtx.GetHeader("x-api-key")
if apiKey == "" {
return nil, fmt.Errorf("api key is required")
}

user := model.Users{}
if err := s.gorm.Where(`"apiKey" = ?`, apiKey).First(&user).Error; err != nil {
return nil, fmt.Errorf("cannot get user from db: %w", err)
}

return &user, nil
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package sessions
package auth

import (
"encoding/gob"
Expand All @@ -22,28 +22,28 @@ type Opts struct {
Gorm *gorm.DB
}

type Sessions struct {
type Auth struct {
sessionManager *scs.SessionManager
gorm *gorm.DB
}

func New(opts Opts) *Sessions {
func NewSessions(opts Opts) *Auth {
sessionManager := scs.New()
sessionManager.Lifetime = 24 * time.Hour * 31
sessionManager.Store = goredisstore.New(opts.Redis)

gob.Register(model.Users{})
gob.Register(helix.User{})

return &Sessions{
return &Auth{
sessionManager: sessionManager,
gorm: opts.Gorm,
}
}

const SESSION_KEY = "__session__"

func (s *Sessions) Middleware() gin.HandlerFunc {
func (s *Auth) Middleware() gin.HandlerFunc {
return func(c *gin.Context) {
defer func() {
if r := recover(); r != nil {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package sessions
package auth

import (
"context"
Expand All @@ -7,7 +7,12 @@ import (
model "github.com/satont/twir/libs/gomodels"
)

func (s *Sessions) GetAuthenticatedUser(ctx context.Context) (*model.Users, error) {
func (s *Auth) GetAuthenticatedUser(ctx context.Context) (*model.Users, error) {
userByApyKey, err := s.GetAuthenticatedUserByApiKey(ctx)
if err == nil {
return userByApyKey, nil
}

user, ok := s.sessionManager.Get(ctx, "dbUser").(model.Users)
if !ok {
return nil, fmt.Errorf("not authenticated")
Expand All @@ -21,7 +26,12 @@ func (s *Sessions) GetAuthenticatedUser(ctx context.Context) (*model.Users, erro
return &freshUser, nil
}

func (s *Sessions) GetSelectedDashboard(ctx context.Context) (string, error) {
func (s *Auth) GetSelectedDashboard(ctx context.Context) (string, error) {
userByApyKey, err := s.GetAuthenticatedUserByApiKey(ctx)
if err == nil {
return userByApyKey.ID, nil
}

selectedDashboardId, ok := s.sessionManager.Get(ctx, "dashboardId").(string)
if !ok {
return "", fmt.Errorf("cannot get dashboardId from context")
Expand All @@ -30,13 +40,13 @@ func (s *Sessions) GetSelectedDashboard(ctx context.Context) (string, error) {
return selectedDashboardId, nil
}

func (s *Sessions) SetSelectedDashboard(ctx context.Context, dashboardId string) error {
func (s *Auth) SetSessionSelectedDashboard(ctx context.Context, dashboardId string) error {
s.sessionManager.Put(ctx, "dashboardId", dashboardId)
s.sessionManager.Commit(ctx)

return nil
}

func (s *Sessions) Logout(ctx context.Context) error {
func (s *Auth) SessionLogout(ctx context.Context) error {
return s.sessionManager.Destroy(ctx)
}
6 changes: 3 additions & 3 deletions apps/api-gql/internal/gql/directives/directives.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package directives

import (
"github.com/twirapp/twir/apps/api-gql/internal/sessions"
"github.com/twirapp/twir/apps/api-gql/internal/auth"
"go.uber.org/fx"
"gorm.io/gorm"
)

type Opts struct {
fx.In

Sessions *sessions.Sessions
Sessions *auth.Auth
Gorm *gorm.DB
}

Expand All @@ -21,6 +21,6 @@ func New(opts Opts) *Directives {
}

type Directives struct {
sessions *sessions.Sessions
sessions *auth.Auth
gorm *gorm.DB
}
9 changes: 6 additions & 3 deletions apps/api-gql/internal/gql/directives/is_authenticated.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package directives

import (
"context"
"fmt"

"github.com/99designs/gqlgen/graphql"
)
Expand All @@ -11,9 +12,11 @@ func (c *Directives) IsAuthenticated(
obj interface{},
next graphql.Resolver,
) (interface{}, error) {
_, err := c.sessions.GetAuthenticatedUser(ctx)
if err != nil {
return nil, err
_, apiKeyErr := c.sessions.GetAuthenticatedUserByApiKey(ctx)
_, sessionErr := c.sessions.GetAuthenticatedUser(ctx)

if apiKeyErr != nil && sessionErr != nil {
return nil, fmt.Errorf("not authenticated")
}

return next(ctx)
Expand Down
33 changes: 33 additions & 0 deletions apps/api-gql/internal/gql/gincontext/gincontext.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package gincontext

import (
"context"
"fmt"

"github.com/gin-gonic/gin"
)

const GinContextKey = "GqlGinContext"

func Middleware() gin.HandlerFunc {
return func(c *gin.Context) {
ctx := context.WithValue(c.Request.Context(), GinContextKey, c)
c.Request = c.Request.WithContext(ctx)
c.Next()
}
}

func GetGinContext(ctx context.Context) (*gin.Context, error) {
ginContext := ctx.Value(GinContextKey)
if ginContext == nil {
err := fmt.Errorf("could not retrieve gin.Context")
return nil, err
}

gc, ok := ginContext.(*gin.Context)
if !ok {
err := fmt.Errorf("gin.Context has wrong type")
return nil, err
}
return gc, nil
}
109 changes: 109 additions & 0 deletions apps/api-gql/internal/gql/resolvers/overlays.resolver.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 68aa301

Please sign in to comment.