4d5cc120d1
DESIGN.md §9.6 now puts the current season at the top: seasons descend by number within a series (season 0 lands last under plain numeric descending) and episodes descend within each season. Changed the two queries in load_seasons; the SPA renders this order as given. arr-compat checked and untouched: it reads seasons with its own ORDER BY number query straight from the database, never through arr-api, and SeasonResource carries season_number, which Jellyseerr matches on rather than position. Sonarr's real API also returns seasons ascending, so the shim keeps the contract it emulates. The existing vanished-flag test indexed seasons positionally; it now looks them up by number so it tests the flag, not the order. New test asserts [2, 1, 0] for seasons and descending episodes within each. .sqlx regenerated via just db-prepare. just ci green locally.
87 lines
2.1 KiB
JSON
87 lines
2.1 KiB
JSON
{
|
|
"db_name": "SQLite",
|
|
"query": "SELECT se.series_id AS \"series_id!: i64\", e.id AS \"id!: i64\", e.season_id AS \"season_id!: i64\", se.number AS \"season_number!: i64\", e.number AS \"number!: i64\", e.title AS \"title!: String\", e.air_date, e.wanted AS \"wanted!: bool\", e.state AS \"state!: String\", e.vanished AS \"vanished!: bool\", e.search_attempts AS \"search_attempts!: i64\", e.last_searched_at\n FROM episodes e JOIN seasons se ON se.id = e.season_id WHERE se.series_id = ? ORDER BY se.number DESC, e.number DESC",
|
|
"describe": {
|
|
"columns": [
|
|
{
|
|
"name": "series_id!: i64",
|
|
"ordinal": 0,
|
|
"type_info": "Integer"
|
|
},
|
|
{
|
|
"name": "id!: i64",
|
|
"ordinal": 1,
|
|
"type_info": "Integer"
|
|
},
|
|
{
|
|
"name": "season_id!: i64",
|
|
"ordinal": 2,
|
|
"type_info": "Integer"
|
|
},
|
|
{
|
|
"name": "season_number!: i64",
|
|
"ordinal": 3,
|
|
"type_info": "Integer"
|
|
},
|
|
{
|
|
"name": "number!: i64",
|
|
"ordinal": 4,
|
|
"type_info": "Integer"
|
|
},
|
|
{
|
|
"name": "title!: String",
|
|
"ordinal": 5,
|
|
"type_info": "Text"
|
|
},
|
|
{
|
|
"name": "air_date",
|
|
"ordinal": 6,
|
|
"type_info": "Text"
|
|
},
|
|
{
|
|
"name": "wanted!: bool",
|
|
"ordinal": 7,
|
|
"type_info": "Integer"
|
|
},
|
|
{
|
|
"name": "state!: String",
|
|
"ordinal": 8,
|
|
"type_info": "Text"
|
|
},
|
|
{
|
|
"name": "vanished!: bool",
|
|
"ordinal": 9,
|
|
"type_info": "Integer"
|
|
},
|
|
{
|
|
"name": "search_attempts!: i64",
|
|
"ordinal": 10,
|
|
"type_info": "Integer"
|
|
},
|
|
{
|
|
"name": "last_searched_at",
|
|
"ordinal": 11,
|
|
"type_info": "Text"
|
|
}
|
|
],
|
|
"parameters": {
|
|
"Right": 1
|
|
},
|
|
"nullable": [
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
true,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
true
|
|
]
|
|
},
|
|
"hash": "580e3bf81062d253fd08c9a4e1a879a0e57d6357ab9b278503cdf8fb5252886a"
|
|
}
|