Feat(Initial): Initial Go codebase
All checks were successful
Webhook-Everything/Webhook-Everything/pipeline/head This commit looks good
All checks were successful
Webhook-Everything/Webhook-Everything/pipeline/head This commit looks good
This commit is contained in:
34
backend/internal/webhookeverything/main.go
Normal file
34
backend/internal/webhookeverything/main.go
Normal file
@@ -0,0 +1,34 @@
|
||||
package webhookeverything
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"time"
|
||||
|
||||
"git.samuelpua.com/telboon/webhook-everything/backend/internal/telegrampackage"
|
||||
"github.com/go-chi/chi"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type Env struct {
|
||||
DB *gorm.DB
|
||||
TelegramEnv *telegrampackage.Env
|
||||
HostUrl string
|
||||
}
|
||||
|
||||
func WebhookEverythingRoutes(db *gorm.DB, telegramEnv *telegrampackage.Env, hostURL string) chi.Router {
|
||||
var env Env
|
||||
env.DB = db
|
||||
env.TelegramEnv = telegramEnv
|
||||
|
||||
// Seed random
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
|
||||
// Web Routes
|
||||
r := chi.NewRouter()
|
||||
r.HandleFunc("/routes/{routeID}", env.handleWebhook)
|
||||
|
||||
// Telegram handlers
|
||||
env.TelegramEnv.AddTelegramHandlerFunc(env.registerWebhook)
|
||||
|
||||
return r
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package webhookeverything
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"net/url"
|
||||
"path"
|
||||
|
||||
"git.samuelpua.com/telboon/webhook-everything/backend/internal/telegrampackage"
|
||||
)
|
||||
|
||||
func (env *Env) registerWebhook(shortCode string, text string) (bool, *string) {
|
||||
commandSplitted := telegrampackage.ParseTelegramBotCommand(text)
|
||||
if len(commandSplitted) > 0 && commandSplitted[0] == "/register-webhook" {
|
||||
newWebhookID := genWebhookCode(6)
|
||||
baseURL, _ := url.Parse(env.HostUrl)
|
||||
baseURL.Path = path.Join(baseURL.Path, "webhook")
|
||||
baseURL.Path = path.Join(baseURL.Path, "routes")
|
||||
baseURL.Path = path.Join(baseURL.Path, newWebhookID)
|
||||
webhookURL := baseURL.String()
|
||||
|
||||
var webhookRoute WebhookRoute
|
||||
webhookRoute.TelegramShortCode = shortCode
|
||||
webhookRoute.WebhookID = newWebhookID
|
||||
env.DB.Create(&webhookRoute)
|
||||
|
||||
responseText := fmt.Sprintf("Your generated webhook URL is: %s", webhookURL)
|
||||
return true, &responseText
|
||||
}
|
||||
return false, nil
|
||||
}
|
||||
|
||||
func genWebhookCode(n int) string {
|
||||
var letters = []rune("abcdefghijklmnopqrstuvwxyz1234567890")
|
||||
runeCode := make([]rune, n)
|
||||
for i := range runeCode {
|
||||
runeCode[i] = letters[rand.Intn(len(letters))]
|
||||
}
|
||||
return string(runeCode)
|
||||
}
|
||||
26
backend/internal/webhookeverything/routegencontrollerweb.go
Normal file
26
backend/internal/webhookeverything/routegencontrollerweb.go
Normal file
@@ -0,0 +1,26 @@
|
||||
package webhookeverything
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"net/http/httputil"
|
||||
)
|
||||
|
||||
func (env *Env) forwardHookToTelegram(r *http.Request, routeID string) error {
|
||||
// Get Telegram code
|
||||
var routeResult WebhookRoute
|
||||
err := env.DB.Where(&WebhookRoute{WebhookID: routeID}).First(&routeResult).Error
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Dump request as string
|
||||
responseStr, err := httputil.DumpRequest(r, true)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Send telegram
|
||||
env.TelegramEnv.TelegramSend(routeResult.TelegramShortCode, string(responseStr))
|
||||
|
||||
return nil
|
||||
}
|
||||
28
backend/internal/webhookeverything/routegenmodel.go
Normal file
28
backend/internal/webhookeverything/routegenmodel.go
Normal file
@@ -0,0 +1,28 @@
|
||||
package webhookeverything
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type WebhookRoute struct {
|
||||
ID uuid.UUID `gorm:"primaryKey;type:uuid;default:uuid_generate_v4()"`
|
||||
CreatedAt time.Time
|
||||
UpdatedAt time.Time
|
||||
DeletedAt gorm.DeletedAt `gorm:"index"`
|
||||
WebhookID string `gorm:"index,unique"`
|
||||
TelegramShortCode string `gorm:"index"`
|
||||
}
|
||||
|
||||
type StatusMessage struct {
|
||||
Status string `json:"status"`
|
||||
Message string `json:"message"`
|
||||
}
|
||||
|
||||
func (statusMessage *StatusMessage) Render(w http.ResponseWriter, r *http.Request) error {
|
||||
// Pre-processing before a response is marshalled and sent across the wire
|
||||
return nil
|
||||
}
|
||||
34
backend/internal/webhookeverything/routegenroutes.go
Normal file
34
backend/internal/webhookeverything/routegenroutes.go
Normal file
@@ -0,0 +1,34 @@
|
||||
package webhookeverything
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"git.samuelpua.com/telboon/webhook-everything/backend/internal/common"
|
||||
"github.com/go-chi/chi"
|
||||
"github.com/go-chi/render"
|
||||
)
|
||||
|
||||
// Handles pre-generated webhooks
|
||||
// @Summary Pre-generated webhooks
|
||||
// @Description Description
|
||||
// @Tags Webhook
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param webhookID path string true "Pre-registered Webhook Path"
|
||||
// @Success 200 {object} common.TextResponse
|
||||
// @Failure 500 {object} common.ErrResponse
|
||||
// @Router /webhook/routes/{webhookID} [POST]
|
||||
func (env *Env) handleWebhook(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
routeID := chi.URLParam(r, "routeID")
|
||||
_ = ctx
|
||||
|
||||
err := env.forwardHookToTelegram(r, routeID)
|
||||
|
||||
if err != nil {
|
||||
render.Render(w, r, common.ErrInternalError(err))
|
||||
return
|
||||
}
|
||||
|
||||
render.Render(w, r, common.NewGenericTextResponse("success", ""))
|
||||
}
|
||||
Reference in New Issue
Block a user