84 lines
2.1 KiB
Go
84 lines
2.1 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"git.lumeweb.com/LumeWeb/gitea-github-proxy/config"
|
|
"git.lumeweb.com/LumeWeb/gitea-github-proxy/db/model"
|
|
"go.uber.org/zap"
|
|
"gorm.io/gorm"
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
func newSettingsApi(cfg *config.Config, db *gorm.DB, logger *zap.Logger) *settingsApi {
|
|
return &settingsApi{config: cfg, db: db, logger: logger}
|
|
}
|
|
|
|
func (s settingsApi) handlerNewApp(w http.ResponseWriter, r *http.Request) {
|
|
manifestData := r.FormValue("manifest")
|
|
|
|
var manifestObj manifest
|
|
|
|
err := json.Unmarshal([]byte(manifestData), &manifestObj)
|
|
if err != nil {
|
|
http.Error(w, "Failed to parse manifest", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
appData := newApp()
|
|
|
|
appRecord := &model.Apps{
|
|
Name: manifestObj.Name,
|
|
Url: manifestObj.Url,
|
|
WebhookUrl: manifestObj.HookAttributes.URL,
|
|
Code: generateTempCode(),
|
|
WebhookSecret: generateTempCode(),
|
|
PrivateKey: appData.PrivateKey,
|
|
}
|
|
|
|
tx := s.db.Create(appRecord)
|
|
if tx.Error != nil {
|
|
s.logger.Error("Error creating app", zap.Error(tx.Error))
|
|
http.Error(w, "Error creating app", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
if len(manifestObj.RedirectURL) == 0 {
|
|
s.logger.Error("Redirect URL is required")
|
|
http.Error(w, "Redirect URL is required", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
redirectUrl, err := url.Parse(manifestObj.RedirectURL)
|
|
if err != nil {
|
|
s.logger.Error("Error parsing redirect URL", zap.Error(err))
|
|
http.Error(w, "Error parsing redirect URL", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
query := redirectUrl.Query()
|
|
|
|
query.Add("code", appRecord.Code)
|
|
|
|
if r.URL.Query().Get("state") != "" {
|
|
query.Add("state", r.URL.Query().Get("state"))
|
|
}
|
|
|
|
redirectUrl.RawQuery = query.Encode()
|
|
|
|
http.Redirect(w, r, redirectUrl.String(), http.StatusFound)
|
|
|
|
}
|
|
|
|
func setupSettingsRoutes(params RouteParams) {
|
|
r := params.R
|
|
|
|
settingsRouter := r.PathPrefix("/settings").Subrouter()
|
|
settingsRouter.Use(giteaOauthVerifyMiddleware(params.Config))
|
|
settingsRouter.Use(requireAuthMiddleware(params.Config))
|
|
|
|
settingsApi := newSettingsApi(params.Config, params.Db, params.Logger)
|
|
|
|
settingsRouter.HandleFunc("/apps/new", settingsApi.handlerNewApp).Methods("POST")
|
|
}
|