-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor: flip api and api-gql path's
- Loading branch information
Showing
14 changed files
with
284 additions
and
89 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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") | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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") | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"` | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} | ||
}); | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.