@@ -508,11 +508,11 @@ impl From<GraphqlSortOrder> for Order {
508
508
509
509
#[ derive( Debug , Serialize , Deserialize , Enum , Clone , PartialEq , Eq , Copy , Default ) ]
510
510
enum MediaSortBy {
511
+ LastUpdated ,
511
512
Title ,
512
513
#[ default]
513
514
ReleaseDate ,
514
515
LastSeen ,
515
- LastUpdated ,
516
516
Rating ,
517
517
}
518
518
@@ -541,6 +541,7 @@ enum MediaGeneralFilter {
541
541
Unrated ,
542
542
Dropped ,
543
543
OnAHold ,
544
+ Completed ,
544
545
Unseen ,
545
546
}
546
547
@@ -553,7 +554,7 @@ struct MediaFilter {
553
554
#[ derive( Debug , Serialize , Deserialize , InputObject , Clone ) ]
554
555
struct MetadataListInput {
555
556
search : SearchInput ,
556
- lot : MediaLot ,
557
+ lot : Option < MediaLot > ,
557
558
filter : Option < MediaFilter > ,
558
559
sort : Option < SortInput < MediaSortBy > > ,
559
560
}
@@ -1945,7 +1946,7 @@ impl MiscellaneousService {
1945
1946
. filter (
1946
1947
Expr :: col ( ( AliasedUserToEntity :: Table , user_to_entity:: Column :: UserId ) ) . eq ( user_id) ,
1947
1948
)
1948
- . join ( JoinType :: Join , calendar_event :: Relation :: Metadata . def ( ) )
1949
+ . inner_join ( Metadata )
1949
1950
. join_rev (
1950
1951
JoinType :: Join ,
1951
1952
UserToEntity :: belongs_to ( CalendarEvent )
@@ -2112,8 +2113,10 @@ impl MiscellaneousService {
2112
2113
. group_by ( metadata:: Column :: Id )
2113
2114
. group_by ( user_to_entity:: Column :: MediaReason )
2114
2115
. filter ( user_to_entity:: Column :: UserId . eq ( user_id) )
2115
- . filter ( metadata:: Column :: Lot . eq ( input. lot ) )
2116
- . join ( JoinType :: Join , metadata:: Relation :: UserToEntity . def ( ) )
2116
+ . apply_if ( input. lot , |query, v| {
2117
+ query. filter ( metadata:: Column :: Lot . eq ( v) )
2118
+ } )
2119
+ . inner_join ( UserToEntity )
2117
2120
. join (
2118
2121
JoinType :: LeftJoin ,
2119
2122
metadata:: Relation :: Review
@@ -2141,7 +2144,7 @@ impl MiscellaneousService {
2141
2144
input. filter . clone ( ) . and_then ( |f| f. collection ) ,
2142
2145
|query, v| {
2143
2146
query
2144
- . join ( JoinType :: Join , metadata :: Relation :: CollectionToEntity . def ( ) )
2147
+ . inner_join ( CollectionToEntity )
2145
2148
. filter ( collection_to_entity:: Column :: CollectionId . eq ( v) )
2146
2149
} ,
2147
2150
)
@@ -2153,6 +2156,7 @@ impl MiscellaneousService {
2153
2156
s => query. filter ( seen:: Column :: State . eq ( match s {
2154
2157
MediaGeneralFilter :: Dropped => SeenState :: Dropped ,
2155
2158
MediaGeneralFilter :: OnAHold => SeenState :: OnAHold ,
2159
+ MediaGeneralFilter :: Completed => SeenState :: InProgress ,
2156
2160
_ => unreachable ! ( ) ,
2157
2161
} ) ) ,
2158
2162
} )
@@ -5969,7 +5973,7 @@ impl MiscellaneousService {
5969
5973
)
5970
5974
} )
5971
5975
. join ( JoinType :: Join , genre:: Relation :: MetadataToGenre . def ( ) )
5972
- // fuck it. we ball. (extremely unsafe, guaranteed to fail if names change)
5976
+ // fuck it. we ball. (extremely unsafe, guaranteed to fail if table names change)
5973
5977
. group_by ( Expr :: cust ( "genre.id, genre.name" ) )
5974
5978
. order_by ( Expr :: col ( Alias :: new ( num_items) ) , Order :: Desc ) ;
5975
5979
let paginator = query
@@ -6011,7 +6015,7 @@ impl MiscellaneousService {
6011
6015
)
6012
6016
} )
6013
6017
. filter ( user_to_entity:: Column :: UserId . eq ( user_id) )
6014
- . join ( JoinType :: Join , metadata_group :: Relation :: UserToEntity . def ( ) )
6018
+ . inner_join ( UserToEntity )
6015
6019
. order_by_asc ( metadata_group:: Column :: Title ) ;
6016
6020
let paginator = query
6017
6021
. clone ( )
@@ -6083,8 +6087,8 @@ impl MiscellaneousService {
6083
6087
) ) ) ) ,
6084
6088
alias,
6085
6089
)
6086
- . join ( JoinType :: LeftJoin , person :: Relation :: MetadataToPerson . def ( ) )
6087
- . join ( JoinType :: Join , person :: Relation :: UserToEntity . def ( ) )
6090
+ . left_join ( MetadataToPerson )
6091
+ . inner_join ( UserToEntity )
6088
6092
. group_by ( person:: Column :: Id )
6089
6093
. group_by ( person:: Column :: Name )
6090
6094
. order_by ( order_by, sort_order) ;
@@ -7013,6 +7017,31 @@ GROUP BY m.id;
7013
7017
Ok ( ( ) )
7014
7018
}
7015
7019
7020
+ async fn remove_old_metadata_from_monitoring_collection ( & self ) -> Result < ( ) > {
7021
+ let older_than = Utc :: now ( )
7022
+ - ChronoDuration :: try_days ( self . config . media . monitoring_remove_after_days ) . unwrap ( ) ;
7023
+ self . db
7024
+ . execute ( Statement :: from_sql_and_values (
7025
+ DbBackend :: Postgres ,
7026
+ r#"
7027
+ DELETE FROM collection_to_entity
7028
+ WHERE id IN (
7029
+ SELECT cte.id
7030
+ FROM collection_to_entity cte
7031
+ JOIN collection c ON cte.collection_id = c.id AND c.name = $1
7032
+ JOIN user_to_entity ute ON cte.metadata_id = ute.metadata_id
7033
+ WHERE ute.metadata_id IS NOT NULL AND ute.last_updated_on < $2
7034
+ );
7035
+ "# ,
7036
+ [
7037
+ DefaultCollection :: Monitoring . to_string ( ) . into ( ) ,
7038
+ older_than. into ( ) ,
7039
+ ] ,
7040
+ ) )
7041
+ . await ?;
7042
+ Ok ( ( ) )
7043
+ }
7044
+
7016
7045
pub async fn remove_useless_data ( & self ) -> Result < ( ) > {
7017
7046
let mut metadata_stream = Metadata :: find ( )
7018
7047
. select_only ( )
@@ -7072,6 +7101,10 @@ GROUP BY m.id;
7072
7101
7073
7102
tracing:: trace!( "Invalidating invalid media import jobs" ) ;
7074
7103
self . invalidate_import_jobs ( ) . await . unwrap ( ) ;
7104
+ tracing:: trace!( "Removing stale media from Monitoring collection" ) ;
7105
+ self . remove_old_metadata_from_monitoring_collection ( )
7106
+ . await
7107
+ . unwrap ( ) ;
7075
7108
tracing:: trace!( "Checking for updates for media in Watchlist" ) ;
7076
7109
self . update_watchlist_metadata_and_send_notifications ( )
7077
7110
. await
0 commit comments