shelfy-v2/internal/controllers/clientController.go

91 lines
2.4 KiB
Go
Raw Normal View History

2025-07-27 14:26:30 +00:00
package controllers
import (
"canguidev/shelfy/internal/client"
"context"
"log"
"net/http"
"time"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
func PostDebridLogin(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
clt := client.NewClient(db)
var creds struct {
Username string `json:"username"`
Password string `json:"password"`
}
if err := c.ShouldBindJSON(&creds); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON format"})
return
}
deviceResp, err := clt.RequestDeviceCodeWithCredentials(c, creds.Username, creds.Password)
if err != nil {
log.Println("[OAuth2] Erreur device_code:", err)
c.JSON(http.StatusInternalServerError, gin.H{"error": "OAuth error: " + err.Error()})
return
}
go func() {
tokens, err := clt.PollDeviceToken(context.Background(), deviceResp.DeviceCode, deviceResp.Interval)
if err != nil {
log.Println("[OAuth2] Polling échoué:", err)
return
}
account := &client.DebridAccount{
Host: "debrid-link.com",
Username: creds.Username,
Password: creds.Password,
IsActive: true,
AccessToken: tokens.AccessToken,
RefreshToken: tokens.RefreshToken,
ExpiresAt: time.Now().Add(time.Duration(tokens.ExpiresIn) * time.Second),
}
if err := db.Create(account).Error; err != nil {
log.Println("[DB] Sauvegarde échouée:", err)
return
}
log.Println("[OAuth2] Compte sauvegardé")
}()
c.JSON(http.StatusOK, gin.H{
"message": "Device code retrieved successfully",
"user_code": deviceResp.UserCode,
"verify_url": deviceResp.VerificationURL,
"polling_delay": deviceResp.Interval,
})
}
}
func GetDebridAccounts(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
clt := client.NewClient(db)
accounts, err := clt.ListDebridAccounts(c)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to list accounts"})
return
}
c.JSON(http.StatusOK, gin.H{
"accounts": accounts,
})
}
}
func GetDebridStatus(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
username := c.Query("username")
var account client.DebridAccount
if err := db.Where("username = ? AND is_active = ?", username, true).First(&account).Error; err != nil {
c.JSON(http.StatusOK, gin.H{"active": false})
return
}
c.JSON(http.StatusOK, gin.H{"active": true})
}
}