363 lines
11 KiB
Go
363 lines
11 KiB
Go
package handlers
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"seanime/internal/extension"
|
|
"seanime/internal/extension_playground"
|
|
|
|
"github.com/labstack/echo/v4"
|
|
)
|
|
|
|
// HandleFetchExternalExtensionData
|
|
//
|
|
// @summary returns the extension data from the given manifest uri.
|
|
// @route /api/v1/extensions/external/fetch [POST]
|
|
// @returns extension.Extension
|
|
func (h *Handler) HandleFetchExternalExtensionData(c echo.Context) error {
|
|
type body struct {
|
|
ManifestURI string `json:"manifestUri"`
|
|
}
|
|
|
|
var b body
|
|
if err := c.Bind(&b); err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
extension, err := h.App.ExtensionRepository.FetchExternalExtensionData(b.ManifestURI)
|
|
if err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
return h.RespondWithData(c, extension)
|
|
}
|
|
|
|
// HandleInstallExternalExtension
|
|
//
|
|
// @summary installs the extension from the given manifest uri.
|
|
// @route /api/v1/extensions/external/install [POST]
|
|
// @returns extension_repo.ExtensionInstallResponse
|
|
func (h *Handler) HandleInstallExternalExtension(c echo.Context) error {
|
|
type body struct {
|
|
ManifestURI string `json:"manifestUri"`
|
|
}
|
|
|
|
var b body
|
|
if err := c.Bind(&b); err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
res, err := h.App.ExtensionRepository.InstallExternalExtension(b.ManifestURI)
|
|
if err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
return h.RespondWithData(c, res)
|
|
}
|
|
|
|
// HandleUninstallExternalExtension
|
|
//
|
|
// @summary uninstalls the extension with the given ID.
|
|
// @route /api/v1/extensions/external/uninstall [POST]
|
|
// @returns bool
|
|
func (h *Handler) HandleUninstallExternalExtension(c echo.Context) error {
|
|
type body struct {
|
|
ID string `json:"id"`
|
|
}
|
|
|
|
var b body
|
|
if err := c.Bind(&b); err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
err := h.App.ExtensionRepository.UninstallExternalExtension(b.ID)
|
|
if err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
return h.RespondWithData(c, true)
|
|
}
|
|
|
|
// HandleUpdateExtensionCode
|
|
//
|
|
// @summary updates the extension code with the given ID and reloads the extensions.
|
|
// @route /api/v1/extensions/external/edit-payload [POST]
|
|
// @returns bool
|
|
func (h *Handler) HandleUpdateExtensionCode(c echo.Context) error {
|
|
type body struct {
|
|
ID string `json:"id"`
|
|
Payload string `json:"payload"`
|
|
}
|
|
|
|
var b body
|
|
if err := c.Bind(&b); err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
err := h.App.ExtensionRepository.UpdateExtensionCode(b.ID, b.Payload)
|
|
if err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
return h.RespondWithData(c, true)
|
|
}
|
|
|
|
// HandleReloadExternalExtensions
|
|
//
|
|
// @summary reloads the external extensions.
|
|
// @route /api/v1/extensions/external/reload [POST]
|
|
// @returns bool
|
|
func (h *Handler) HandleReloadExternalExtensions(c echo.Context) error {
|
|
h.App.ExtensionRepository.ReloadExternalExtensions()
|
|
return h.RespondWithData(c, true)
|
|
}
|
|
|
|
// HandleReloadExternalExtension
|
|
//
|
|
// @summary reloads the external extension with the given ID.
|
|
// @route /api/v1/extensions/external/reload [POST]
|
|
// @returns bool
|
|
func (h *Handler) HandleReloadExternalExtension(c echo.Context) error {
|
|
type body struct {
|
|
ID string `json:"id"`
|
|
}
|
|
|
|
var b body
|
|
if err := c.Bind(&b); err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
h.App.ExtensionRepository.ReloadExternalExtension(b.ID)
|
|
return h.RespondWithData(c, true)
|
|
}
|
|
|
|
// HandleListExtensionData
|
|
//
|
|
// @summary returns the loaded extensions
|
|
// @route /api/v1/extensions/list [GET]
|
|
// @returns []extension.Extension
|
|
func (h *Handler) HandleListExtensionData(c echo.Context) error {
|
|
extensions := h.App.ExtensionRepository.ListExtensionData()
|
|
return h.RespondWithData(c, extensions)
|
|
}
|
|
|
|
// HandleGetExtensionPayload
|
|
//
|
|
// @summary returns the payload of the extension with the given ID.
|
|
// @route /api/v1/extensions/payload/{id} [GET]
|
|
// @returns string
|
|
func (h *Handler) HandleGetExtensionPayload(c echo.Context) error {
|
|
payload := h.App.ExtensionRepository.GetExtensionPayload(c.Param("id"))
|
|
return h.RespondWithData(c, payload)
|
|
}
|
|
|
|
// HandleListDevelopmentModeExtensions
|
|
//
|
|
// @summary returns the development mode extensions
|
|
// @route /api/v1/extensions/list/development [GET]
|
|
// @returns []extension.Extension
|
|
func (h *Handler) HandleListDevelopmentModeExtensions(c echo.Context) error {
|
|
extensions := h.App.ExtensionRepository.ListDevelopmentModeExtensions()
|
|
return h.RespondWithData(c, extensions)
|
|
}
|
|
|
|
// HandleGetAllExtensions
|
|
//
|
|
// @summary returns all loaded and invalid extensions.
|
|
// @route /api/v1/extensions/all [POST]
|
|
// @returns extension_repo.AllExtensions
|
|
func (h *Handler) HandleGetAllExtensions(c echo.Context) error {
|
|
type body struct {
|
|
WithUpdates bool `json:"withUpdates"`
|
|
}
|
|
|
|
var b body
|
|
if err := c.Bind(&b); err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
extensions := h.App.ExtensionRepository.GetAllExtensions(b.WithUpdates)
|
|
return h.RespondWithData(c, extensions)
|
|
}
|
|
|
|
// HandleGetExtensionUpdateData
|
|
//
|
|
// @summary returns the update data that were found for the extensions.
|
|
// @route /api/v1/extensions/updates [GET]
|
|
// @returns []extension_repo.UpdateData
|
|
func (h *Handler) HandleGetExtensionUpdateData(c echo.Context) error {
|
|
return h.RespondWithData(c, h.App.ExtensionRepository.GetUpdateData())
|
|
}
|
|
|
|
// HandleListMangaProviderExtensions
|
|
//
|
|
// @summary returns the installed manga providers.
|
|
// @route /api/v1/extensions/list/manga-provider [GET]
|
|
// @returns []extension_repo.MangaProviderExtensionItem
|
|
func (h *Handler) HandleListMangaProviderExtensions(c echo.Context) error {
|
|
extensions := h.App.ExtensionRepository.ListMangaProviderExtensions()
|
|
return h.RespondWithData(c, extensions)
|
|
}
|
|
|
|
// HandleListOnlinestreamProviderExtensions
|
|
//
|
|
// @summary returns the installed online streaming providers.
|
|
// @route /api/v1/extensions/list/onlinestream-provider [GET]
|
|
// @returns []extension_repo.OnlinestreamProviderExtensionItem
|
|
func (h *Handler) HandleListOnlinestreamProviderExtensions(c echo.Context) error {
|
|
extensions := h.App.ExtensionRepository.ListOnlinestreamProviderExtensions()
|
|
return h.RespondWithData(c, extensions)
|
|
}
|
|
|
|
// HandleListAnimeTorrentProviderExtensions
|
|
//
|
|
// @summary returns the installed torrent providers.
|
|
// @route /api/v1/extensions/list/anime-torrent-provider [GET]
|
|
// @returns []extension_repo.AnimeTorrentProviderExtensionItem
|
|
func (h *Handler) HandleListAnimeTorrentProviderExtensions(c echo.Context) error {
|
|
extensions := h.App.ExtensionRepository.ListAnimeTorrentProviderExtensions()
|
|
return h.RespondWithData(c, extensions)
|
|
}
|
|
|
|
// HandleGetPluginSettings
|
|
//
|
|
// @summary returns the plugin settings.
|
|
// @route /api/v1/extensions/plugin-settings [GET]
|
|
// @returns extension_repo.StoredPluginSettingsData
|
|
func (h *Handler) HandleGetPluginSettings(c echo.Context) error {
|
|
settings := h.App.ExtensionRepository.GetPluginSettings()
|
|
return h.RespondWithData(c, settings)
|
|
}
|
|
|
|
// HandleSetPluginSettingsPinnedTrays
|
|
//
|
|
// @summary sets the pinned trays in the plugin settings.
|
|
// @route /api/v1/extensions/plugin-settings/pinned-trays [POST]
|
|
// @returns bool
|
|
func (h *Handler) HandleSetPluginSettingsPinnedTrays(c echo.Context) error {
|
|
type body struct {
|
|
PinnedTrayPluginIds []string `json:"pinnedTrayPluginIds"`
|
|
}
|
|
|
|
var b body
|
|
if err := c.Bind(&b); err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
h.App.ExtensionRepository.SetPluginSettingsPinnedTrays(b.PinnedTrayPluginIds)
|
|
return h.RespondWithData(c, true)
|
|
}
|
|
|
|
// HandleGrantPluginPermissions
|
|
//
|
|
// @summary grants the plugin permissions to the extension with the given ID.
|
|
// @route /api/v1/extensions/plugin-permissions/grant [POST]
|
|
// @returns bool
|
|
func (h *Handler) HandleGrantPluginPermissions(c echo.Context) error {
|
|
type body struct {
|
|
ID string `json:"id"`
|
|
}
|
|
|
|
var b body
|
|
if err := c.Bind(&b); err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
h.App.ExtensionRepository.GrantPluginPermissions(b.ID)
|
|
return h.RespondWithData(c, true)
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// HandleRunExtensionPlaygroundCode
|
|
//
|
|
// @summary runs the code in the extension playground.
|
|
// @desc Returns the logs
|
|
// @route /api/v1/extensions/playground/run [POST]
|
|
// @returns extension_playground.RunPlaygroundCodeResponse
|
|
func (h *Handler) HandleRunExtensionPlaygroundCode(c echo.Context) error {
|
|
type body struct {
|
|
Params *extension_playground.RunPlaygroundCodeParams `json:"params"`
|
|
}
|
|
|
|
var b body
|
|
if err := c.Bind(&b); err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
res, err := h.App.ExtensionPlaygroundRepository.RunPlaygroundCode(b.Params)
|
|
if err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
return h.RespondWithData(c, res)
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// HandleGetExtensionUserConfig
|
|
//
|
|
// @summary returns the user config definition and current values for the extension with the given ID.
|
|
// @route /api/v1/extensions/user-config/{id} [GET]
|
|
// @returns extension_repo.ExtensionUserConfig
|
|
func (h *Handler) HandleGetExtensionUserConfig(c echo.Context) error {
|
|
id := c.Param("id")
|
|
if id == "" {
|
|
return h.RespondWithError(c, fmt.Errorf("id is required"))
|
|
}
|
|
config := h.App.ExtensionRepository.GetExtensionUserConfig(id)
|
|
return h.RespondWithData(c, config)
|
|
}
|
|
|
|
// HandleSaveExtensionUserConfig
|
|
//
|
|
// @summary saves the user config for the extension with the given ID and reloads it.
|
|
// @route /api/v1/extensions/user-config [POST]
|
|
// @returns bool
|
|
func (h *Handler) HandleSaveExtensionUserConfig(c echo.Context) error {
|
|
type body struct {
|
|
ID string `json:"id"` // The extension ID
|
|
Version int `json:"version"` // The current extension user config definition version
|
|
Values map[string]string `json:"values"` // The values
|
|
}
|
|
|
|
var b body
|
|
if err := c.Bind(&b); err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
config := &extension.SavedUserConfig{
|
|
Version: b.Version,
|
|
Values: b.Values,
|
|
}
|
|
|
|
err := h.App.ExtensionRepository.SaveExtensionUserConfig(b.ID, config)
|
|
if err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
return h.RespondWithData(c, true)
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// HandleGetMarketplaceExtensions
|
|
//
|
|
// @summary returns the marketplace extensions.
|
|
// @route /api/v1/extensions/marketplace [GET]
|
|
// @returns []extension.Extension
|
|
func (h *Handler) HandleGetMarketplaceExtensions(c echo.Context) error {
|
|
encodedMarketplaceUrl := c.QueryParam("marketplace")
|
|
marketplaceUrl := ""
|
|
|
|
if encodedMarketplaceUrl != "" {
|
|
marketplaceUrl, _ = url.PathUnescape(encodedMarketplaceUrl)
|
|
}
|
|
|
|
extensions, err := h.App.ExtensionRepository.GetMarketplaceExtensions(marketplaceUrl)
|
|
if err != nil {
|
|
return h.RespondWithError(c, err)
|
|
}
|
|
|
|
return h.RespondWithData(c, extensions)
|
|
}
|