diff --git a/db/db.go b/db/db.go index 5bf658a..681a793 100644 --- a/db/db.go +++ b/db/db.go @@ -7,6 +7,7 @@ import ( "os" "polaris/ent" "polaris/ent/downloadclients" + "polaris/ent/episode" "polaris/ent/history" "polaris/ent/indexers" "polaris/ent/series" @@ -125,6 +126,15 @@ func (c *Client) GetSeriesDetails(id int) *SeriesDetails { } } +func (c *Client) DeleteSeries(id int) error { + _, err := c.ent.Series.Delete().Where(series.ID(id)).Exec(context.TODO()) + if err != nil { + return err + } + _, err = c.ent.Episode.Delete().Where(episode.SeriesID(id)).Exec(context.TODO()) + return err +} + func (c *Client) SaveEposideDetail(d *ent.Episode) (int, error) { ep, err := c.ent.Episode.Create(). SetAirDate(d.AirDate). diff --git a/server/server.go b/server/server.go index 23238fe..a7a64f3 100644 --- a/server/server.go +++ b/server/server.go @@ -62,6 +62,7 @@ func (s *Server) Serve() error { tv.POST("/watchlist", HttpHandler(s.AddWatchlist)) tv.GET("/watchlist", HttpHandler(s.GetWatchlist)) tv.GET("/series/:id", HttpHandler(s.GetTvDetails)) + tv.DELETE("/series/:id", HttpHandler(s.DeleteFromWatchlist)) tv.GET("/resolutions", HttpHandler(s.GetAvailableResolutions)) } indexer := api.Group("/indexer") diff --git a/server/watchlist.go b/server/watchlist.go index fb578e2..a9b8eb2 100644 --- a/server/watchlist.go +++ b/server/watchlist.go @@ -99,4 +99,16 @@ func (s *Server) GetAvailableResolutions(c *gin.Context) (interface{}, error) { db.R1080p, db.R4k, }, nil +} + +func (s *Server) DeleteFromWatchlist(c *gin.Context) (interface{}, error) { + ids := c.Param("id") + id, err := strconv.Atoi(ids) + if err != nil { + return nil, errors.Wrap(err, "convert") + } + if err := s.db.DeleteSeries(id); err != nil { + return nil, errors.Wrap(err, "delete db") + } + return "success", nil } \ No newline at end of file diff --git a/ui/lib/providers/series_details.dart b/ui/lib/providers/series_details.dart index 69f6d7a..eca56d7 100644 --- a/ui/lib/providers/series_details.dart +++ b/ui/lib/providers/series_details.dart @@ -10,8 +10,10 @@ var seriesDetailsProvider = AsyncNotifierProvider.autoDispose class SeriesDetailData extends AutoDisposeFamilyAsyncNotifier { + String? id; @override FutureOr build(String arg) async { + id = arg; final dio = await APIs.getDio(); var resp = await dio.get("${APIs.seriesDetailUrl}$arg"); var rsp = ServerResponse.fromJson(resp.data); @@ -21,9 +23,18 @@ class SeriesDetailData return SeriesDetails.fromJson(rsp.data); } + Future delete() async { + final dio = await APIs.getDio(); + var resp = await dio.delete("${APIs.seriesDetailUrl}$id"); + var rsp = ServerResponse.fromJson(resp.data); + if (rsp.code != 0) { + throw rsp.message; + } + } + Future searchAndDownload( String seriesId, int seasonNum, int episodeNum) async { - final dio = await APIs.getDio(); + final dio = await APIs.getDio(); var resp = await dio.post(APIs.searchAndDownloadUrl, data: { "id": int.parse(seriesId), "season": seasonNum, diff --git a/ui/lib/providers/welcome_data.dart b/ui/lib/providers/welcome_data.dart index 9dfdd20..6809ab2 100644 --- a/ui/lib/providers/welcome_data.dart +++ b/ui/lib/providers/welcome_data.dart @@ -4,7 +4,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:ui/providers/APIs.dart'; import 'package:ui/providers/server_response.dart'; -final welcomePageDataProvider = FutureProvider((ref) async { +final welcomePageDataProvider = FutureProvider.autoDispose((ref) async { final dio = await APIs.getDio(); var resp = await dio.get(APIs.watchlistUrl); var sp = ServerResponse.fromJson(resp.data); diff --git a/ui/lib/tv_details.dart b/ui/lib/tv_details.dart index c8f45a8..457f01b 100644 --- a/ui/lib/tv_details.dart +++ b/ui/lib/tv_details.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; import 'package:ui/providers/APIs.dart'; import 'package:ui/providers/series_details.dart'; import 'package:ui/utils.dart'; +import 'package:ui/weclome.dart'; class TvDetailsPage extends ConsumerStatefulWidget { static const route = "/series/:id"; @@ -112,18 +114,37 @@ class _TvDetailsPageState extends ConsumerState { ), ), ), - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + Expanded( + child: Row( children: [ - Text( - "${details!.name}", - style: const TextStyle( - fontSize: 14, - fontWeight: FontWeight.bold), - ), - const Text(""), - Text(details!.overview!) + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "${details!.name}", + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold), + ), + const Text(""), + Text(details!.overview!) + ], + )), + Column( + children: [ + IconButton( + onPressed: () { + ref + .read(seriesDetailsProvider( + seriesId) + .notifier) + .delete(); + context.pop(); + }, + icon: const Icon(Icons.delete)) + ], + ) ], ), ),