mirror of
https://github.com/simon-ding/polaris.git
synced 2026-06-01 15:37:50 +08:00
feat: add series delete feature
This commit is contained in:
10
db/db.go
10
db/db.go
@@ -7,6 +7,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"polaris/ent"
|
"polaris/ent"
|
||||||
"polaris/ent/downloadclients"
|
"polaris/ent/downloadclients"
|
||||||
|
"polaris/ent/episode"
|
||||||
"polaris/ent/history"
|
"polaris/ent/history"
|
||||||
"polaris/ent/indexers"
|
"polaris/ent/indexers"
|
||||||
"polaris/ent/series"
|
"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) {
|
func (c *Client) SaveEposideDetail(d *ent.Episode) (int, error) {
|
||||||
ep, err := c.ent.Episode.Create().
|
ep, err := c.ent.Episode.Create().
|
||||||
SetAirDate(d.AirDate).
|
SetAirDate(d.AirDate).
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ func (s *Server) Serve() error {
|
|||||||
tv.POST("/watchlist", HttpHandler(s.AddWatchlist))
|
tv.POST("/watchlist", HttpHandler(s.AddWatchlist))
|
||||||
tv.GET("/watchlist", HttpHandler(s.GetWatchlist))
|
tv.GET("/watchlist", HttpHandler(s.GetWatchlist))
|
||||||
tv.GET("/series/:id", HttpHandler(s.GetTvDetails))
|
tv.GET("/series/:id", HttpHandler(s.GetTvDetails))
|
||||||
|
tv.DELETE("/series/:id", HttpHandler(s.DeleteFromWatchlist))
|
||||||
tv.GET("/resolutions", HttpHandler(s.GetAvailableResolutions))
|
tv.GET("/resolutions", HttpHandler(s.GetAvailableResolutions))
|
||||||
}
|
}
|
||||||
indexer := api.Group("/indexer")
|
indexer := api.Group("/indexer")
|
||||||
|
|||||||
@@ -100,3 +100,15 @@ func (s *Server) GetAvailableResolutions(c *gin.Context) (interface{}, error) {
|
|||||||
db.R4k,
|
db.R4k,
|
||||||
}, nil
|
}, 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
|
||||||
|
}
|
||||||
@@ -10,8 +10,10 @@ var seriesDetailsProvider = AsyncNotifierProvider.autoDispose
|
|||||||
|
|
||||||
class SeriesDetailData
|
class SeriesDetailData
|
||||||
extends AutoDisposeFamilyAsyncNotifier<SeriesDetails, String> {
|
extends AutoDisposeFamilyAsyncNotifier<SeriesDetails, String> {
|
||||||
|
String? id;
|
||||||
@override
|
@override
|
||||||
FutureOr<SeriesDetails> build(String arg) async {
|
FutureOr<SeriesDetails> build(String arg) async {
|
||||||
|
id = arg;
|
||||||
final dio = await APIs.getDio();
|
final dio = await APIs.getDio();
|
||||||
var resp = await dio.get("${APIs.seriesDetailUrl}$arg");
|
var resp = await dio.get("${APIs.seriesDetailUrl}$arg");
|
||||||
var rsp = ServerResponse.fromJson(resp.data);
|
var rsp = ServerResponse.fromJson(resp.data);
|
||||||
@@ -21,9 +23,18 @@ class SeriesDetailData
|
|||||||
return SeriesDetails.fromJson(rsp.data);
|
return SeriesDetails.fromJson(rsp.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> 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<String> searchAndDownload(
|
Future<String> searchAndDownload(
|
||||||
String seriesId, int seasonNum, int episodeNum) async {
|
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: {
|
var resp = await dio.post(APIs.searchAndDownloadUrl, data: {
|
||||||
"id": int.parse(seriesId),
|
"id": int.parse(seriesId),
|
||||||
"season": seasonNum,
|
"season": seasonNum,
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||||||
import 'package:ui/providers/APIs.dart';
|
import 'package:ui/providers/APIs.dart';
|
||||||
import 'package:ui/providers/server_response.dart';
|
import 'package:ui/providers/server_response.dart';
|
||||||
|
|
||||||
final welcomePageDataProvider = FutureProvider((ref) async {
|
final welcomePageDataProvider = FutureProvider.autoDispose((ref) async {
|
||||||
final dio = await APIs.getDio();
|
final dio = await APIs.getDio();
|
||||||
var resp = await dio.get(APIs.watchlistUrl);
|
var resp = await dio.get(APIs.watchlistUrl);
|
||||||
var sp = ServerResponse.fromJson(resp.data);
|
var sp = ServerResponse.fromJson(resp.data);
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.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/APIs.dart';
|
||||||
import 'package:ui/providers/series_details.dart';
|
import 'package:ui/providers/series_details.dart';
|
||||||
import 'package:ui/utils.dart';
|
import 'package:ui/utils.dart';
|
||||||
|
import 'package:ui/weclome.dart';
|
||||||
|
|
||||||
class TvDetailsPage extends ConsumerStatefulWidget {
|
class TvDetailsPage extends ConsumerStatefulWidget {
|
||||||
static const route = "/series/:id";
|
static const route = "/series/:id";
|
||||||
@@ -112,18 +114,37 @@ class _TvDetailsPageState extends ConsumerState<TvDetailsPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Flexible(
|
Expanded(
|
||||||
child: Column(
|
child: Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Expanded(
|
||||||
"${details!.name}",
|
child: Column(
|
||||||
style: const TextStyle(
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
fontSize: 14,
|
children: [
|
||||||
fontWeight: FontWeight.bold),
|
Text(
|
||||||
),
|
"${details!.name}",
|
||||||
const Text(""),
|
style: const TextStyle(
|
||||||
Text(details!.overview!)
|
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))
|
||||||
|
],
|
||||||
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user