Skip to content

Commit

Permalink
refactor: flip api and api-gql path's
Browse files Browse the repository at this point in the history
  • Loading branch information
Satont committed May 2, 2024
1 parent 42c4e2b commit 572ccd8
Show file tree
Hide file tree
Showing 14 changed files with 284 additions and 89 deletions.
6 changes: 6 additions & 0 deletions apps/api-gql/cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@ import (
"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/libs/baseapp"
buscore "github.com/twirapp/twir/libs/bus-core"
commandscache "github.com/twirapp/twir/libs/cache/commands"
keywordscacher "github.com/twirapp/twir/libs/cache/keywords"
twitchcache "github.com/twirapp/twir/libs/cache/twitch"
"github.com/twirapp/twir/libs/grpc/clients"
"github.com/twirapp/twir/libs/grpc/events"
"github.com/twirapp/twir/libs/grpc/tokens"
"go.uber.org/fx"
)
Expand All @@ -28,6 +30,9 @@ func main() {
func(config cfg.Config) tokens.TokensClient {
return clients.NewTokens(config.AppEnv)
},
func(config cfg.Config) events.EventsClient {
return clients.NewEvents(config.AppEnv)
},
minio.New,
twitchcache.New,
commandscache.New,
Expand All @@ -41,6 +46,7 @@ func main() {
),
fx.Invoke(
pubclicroutes.New,
webhooks.New,
),
).Run()
}
67 changes: 67 additions & 0 deletions apps/api-gql/internal/routes/webhooks/donate-stream.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package webhooks

import (
"log/slog"
"net/http"

"github.com/gin-gonic/gin"
"github.com/goccy/go-json"
model "github.com/satont/twir/libs/gomodels"
)

type donateStreamIncomingData struct {
Type string `json:"type,omitempty"`
Uid string `json:"uid"`
Message string `json:"message"`
Sum string `json:"sum"`
Nickname string `json:"nickname"`
}

func (c *Webhooks) donateStreamHandler(g *gin.Context) {
integration := model.ChannelsIntegrations{}
id := g.Param("id")

if err := c.db.
WithContext(g.Request.Context()).
Where("id = ?", id).First(&integration).Error; err != nil {
g.JSON(http.StatusNotFound, gin.H{"error": "Integration not found"})
return
}

body := &donateStreamIncomingData{}
if err := g.BindJSON(body); err != nil {
g.JSON(http.StatusBadRequest, gin.H{"error": "Bad request"})
return
}

if body.Type == "confirm" {
value, err := c.redis.Get(
g.Request.Context(),
"donate_stream_confirmation"+integration.IntegrationID,
).Result()
if err != nil {
c.logger.Error("cannot get confirmation from redis", slog.Any("err", err))
g.JSON(http.StatusInternalServerError, gin.H{"error": "Internal error"})
return
}

integrationsMessage := &pbMessage{
TwitchUserId: integration.ChannelID,
Amount: body.Sum,
Currency: "RUB",
Message: body.Message,
UserName: body.Nickname,
}
integrationsNameBytes, err := json.Marshal(integrationsMessage)
if err != nil {
c.logger.Error("cannot marshal message", slog.Any("err", err))
} else {
c.pubSub.Publish("donations:new", integrationsNameBytes)
}

g.String(http.StatusOK, value)
return
}

g.String(http.StatusOK, "ok")
}
62 changes: 62 additions & 0 deletions apps/api-gql/internal/routes/webhooks/donatello.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package webhooks

import (
"log/slog"
"net/http"

"github.com/gin-gonic/gin"
"github.com/goccy/go-json"
model "github.com/satont/twir/libs/gomodels"
)

type donatelloBody struct {
PubId string `json:"pubId"`
ClientName string `json:"clientName"`
Message string `json:"message"`
Amount string `json:"amount"`
Currency string `json:"currency"`
Source string `json:"source"`
Goal string `json:"goal"`
IsPublished bool `json:"isPublished"`
CreatedAt string `json:"createdAt"`
}

func (c *Webhooks) donatelloHandler(g *gin.Context) {
apiKey := g.GetHeader("X-Key")
if apiKey == "" {
g.JSON(http.StatusBadRequest, gin.H{"error": "X-Key header is required"})
return
}

integration := &model.ChannelsIntegrations{}
if err := c.db.
WithContext(g.Request.Context()).
Where(`"id" = ?`, apiKey).
First(integration).
Error; err != nil {
g.JSON(http.StatusNotFound, gin.H{"error": "Integration not found"})
return
}

body := &donatelloBody{}
if err := g.BindJSON(body); err != nil {
g.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}

integrationsMessage := &pbMessage{
TwitchUserId: integration.ChannelID,
Amount: body.Amount,
Currency: body.Currency,
Message: body.Message,
UserName: body.ClientName,
}
integrationsNameBytes, err := json.Marshal(integrationsMessage)
if err != nil {
c.logger.Error("cannot marshal message", slog.Any("err", err))
} else {
c.pubSub.Publish("donations:new", integrationsNameBytes)
}

g.JSON(http.StatusOK, "ok")
}
61 changes: 61 additions & 0 deletions apps/api-gql/internal/routes/webhooks/webhooks.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package webhooks

import (
"github.com/redis/go-redis/v9"
cfg "github.com/satont/twir/libs/config"
"github.com/satont/twir/libs/logger"
"github.com/satont/twir/libs/pubsub"
"github.com/twirapp/twir/apps/api-gql/internal/httpserver"
"github.com/twirapp/twir/libs/grpc/events"
"go.uber.org/fx"
"gorm.io/gorm"
)

type Opts struct {
fx.In

Server *httpserver.Server
Redis *redis.Client
Db *gorm.DB
EventsGrpc events.EventsClient
Logger logger.Logger
Config cfg.Config
}

type Webhooks struct {
redis *redis.Client
db *gorm.DB
eventsGrpc events.EventsClient
logger logger.Logger
config cfg.Config
pubSub *pubsub.PubSub
}

func New(opts Opts) (*Webhooks, error) {
pb, err := pubsub.NewPubSub(opts.Config.RedisUrl)
if err != nil {
return nil, err
}

p := &Webhooks{
redis: opts.Redis,
db: opts.Db,
eventsGrpc: opts.EventsGrpc,
logger: opts.Logger,
config: opts.Config,
pubSub: pb,
}

opts.Server.POST("/webhooks/integrations/donatestream/:id", p.donateStreamHandler)
opts.Server.POST("/webhooks/integrations/donatello", p.donatelloHandler)

return p, nil
}

type pbMessage struct {
TwitchUserId string `json:"twitchUserId"`
Amount string `json:"amount"`
Currency string `json:"currency"`
Message string `json:"message"`
UserName string `json:"userName"`
}
16 changes: 8 additions & 8 deletions apps/integrations/src/pubsub.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { config } from '@twir/config';
import { createPubSub } from '@twir/pubsub';
import { config } from '@twir/config'
import { createPubSub } from '@twir/pubsub'

import { onDonation } from './utils/onDonation.js';
import { onDonation } from './utils/onDonation.js'

const pubSub = await createPubSub(config.REDIS_URL);
const pubSub = await createPubSub(config.REDIS_URL)

pubSub.subscribe('donations:new', async (message) => {
try {
const data = JSON.parse(message);
await onDonation(data);
const data = JSON.parse(message)
await onDonation(data)
} catch (e) {
console.log(message, e);
console.log(message, e)
}
});
})
8 changes: 4 additions & 4 deletions docker-compose.stack.yml
Original file line number Diff line number Diff line change
Expand Up @@ -163,9 +163,9 @@ services:
deploy:
labels:
- traefik.enable=true
- traefik.http.routers.twir-api.rule=Host(`twir.app`) && PathPrefix(`/api`)
- traefik.http.routers.twir-api.rule=Host(`twir.app`) && PathPrefix(`/api-old`)
- traefik.http.routers.twir-api.middlewares=api-stripprefix
- traefik.http.middlewares.api-stripprefix.stripprefix.prefixes=/api
- traefik.http.middlewares.api-stripprefix.stripprefix.prefixes=/api-old
- traefik.http.services.twir-api.loadbalancer.server.port=3002
- traefik.docker.network=traefik-public
update_config:
Expand All @@ -188,9 +188,9 @@ services:
deploy:
labels:
- traefik.enable=true
- traefik.http.routers.twir-api-gql.rule=Host(`twir.app`) && PathPrefix(`/api-new`)
- traefik.http.routers.twir-api-gql.rule=Host(`twir.app`) && PathPrefix(`/api`)
- traefik.http.routers.twir-api-gql.middlewares=api-gql-stripprefix
- traefik.http.middlewares.api-gql-stripprefix.stripprefix.prefixes=/api-new
- traefik.http.middlewares.api-gql-stripprefix.stripprefix.prefixes=/api
- traefik.http.services.twir-api-gql.loadbalancer.server.port=3009
- traefik.docker.network=traefik-public
update_config:
Expand Down
16 changes: 8 additions & 8 deletions frontend/dashboard/src/api/twirp.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { TwirpFetchTransport } from '@protobuf-ts/twirp-transport';
import { AdminClient, ProtectedClient, UnProtectedClient } from '@twir/api/api.client';
import { TwirpFetchTransport } from '@protobuf-ts/twirp-transport'
import { AdminClient, ProtectedClient, UnProtectedClient } from '@twir/api/api.client'

const transport = new TwirpFetchTransport({
baseUrl: `${window.location.origin}/api/v1`,
sendJson: import.meta.env.DEV,
});
export const protectedApiClient = new ProtectedClient(transport);
export const unprotectedApiClient = new UnProtectedClient(transport);
export const adminApiClient = new AdminClient(transport);
baseUrl: `${window.location.origin}/api-old/v1`,
sendJson: import.meta.env.DEV
})
export const protectedApiClient = new ProtectedClient(transport)
export const unprotectedApiClient = new UnProtectedClient(transport)
export const adminApiClient = new AdminClient(transport)
4 changes: 2 additions & 2 deletions frontend/dashboard/src/plugins/urql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import { Client, cacheExchange, fetchExchange, subscriptionExchange } from '@urq
import { type SubscribePayload, createClient as createWS } from 'graphql-ws'
import { ref } from 'vue'

const wsUrl = `${window.location.protocol === 'https:' ? 'wss' : 'ws'}://${window.location.host}/api-new/query`
const gqlApiUrl = `${window.location.protocol}//${window.location.host}/api-new/query`
const wsUrl = `${window.location.protocol === 'https:' ? 'wss' : 'ws'}://${window.location.host}/api/query`
const gqlApiUrl = `${window.location.protocol}//${window.location.host}/api/query`

const gqlWs = createWS({
url: wsUrl,
Expand Down
Loading

0 comments on commit 572ccd8

Please sign in to comment.