91 lines
2.4 KiB
Go
91 lines
2.4 KiB
Go
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})
|
|
}
|
|
}
|