Feat(Initial): Initial Go codebase
All checks were successful
Webhook-Everything/Webhook-Everything/pipeline/head This commit looks good

This commit is contained in:
2022-05-29 00:06:52 +08:00
parent f31bc0cd52
commit 53829a2788
27 changed files with 1489 additions and 0 deletions

View 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
}

View File

@@ -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)
}

View 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
}

View 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
}

View 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", ""))
}