fix(ombi): resolve TV request status, user, and date display (Issue #53)
Build and Push Docker Image / build (push) Successful in 1m46s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m33s
CI / Security audit (push) Successful in 1m56s
CI / Swagger Validation & Coverage (push) Successful in 2m35s
CI / Tests & coverage (push) Successful in 2m51s
Build and Push Docker Image / build (push) Successful in 1m46s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m33s
CI / Security audit (push) Successful in 1m56s
CI / Swagger Validation & Coverage (push) Successful in 2m35s
CI / Tests & coverage (push) Successful in 2m51s
Ombi's TV API nests all request data (requestedUser, approved, available, denied, requested, requestedDate) inside childRequests[] sub-objects. The application previously only inspected top-level properties, causing TV shows to consistently display 'unknown' status, 'unknown' user, and no request date. Changes: - OmbiRetriever._hydrateRequest(): hydrate requestedUser on each childRequests entry and promote requestedDate to top level - getRequestStatus() (server + client): aggregate status flags from childRequests[] when top-level properties are absent - Client date display: fallback to childRequests[0].requestedDate - Add 18 unit tests covering childRequests hydration, status aggregation, and date promotion Closes #53
This commit is contained in:
+1
-1
@@ -132,7 +132,7 @@ function createApp({ skipRateLimits = false } = {}) {
|
||||
* version:
|
||||
* type: string
|
||||
* description: sofarr version
|
||||
* example: "1.7.24"
|
||||
* example: "1.7.25"
|
||||
* x-code-samples:
|
||||
* - lang: curl
|
||||
* label: cURL
|
||||
|
||||
@@ -163,12 +163,14 @@ class OmbiRetriever extends ArrRetriever {
|
||||
_hydrateRequest(req) {
|
||||
if (!req) return req;
|
||||
|
||||
let result = req;
|
||||
|
||||
const reqUserId = req.requestedUserId || req.RequestedUserId;
|
||||
if (reqUserId && this.cache.userMap.has(reqUserId)) {
|
||||
const cachedUser = this.cache.userMap.get(reqUserId);
|
||||
|
||||
|
||||
let requestedUser = req.requestedUser || req.RequestedUser;
|
||||
|
||||
|
||||
// If requestedUser is not an object or is empty/null, populate it
|
||||
if (!requestedUser || typeof requestedUser !== 'object' || Object.keys(requestedUser).length === 0) {
|
||||
const hydratedUser = {
|
||||
@@ -178,15 +180,56 @@ class OmbiRetriever extends ArrRetriever {
|
||||
userAlias: cachedUser.userAlias || cachedUser.UserAlias || '',
|
||||
normalizedUserName: cachedUser.normalizedUserName || cachedUser.NormalizedUserName || ''
|
||||
};
|
||||
|
||||
return {
|
||||
|
||||
result = {
|
||||
...req,
|
||||
requestedUser: hydratedUser,
|
||||
RequestedUser: hydratedUser
|
||||
};
|
||||
}
|
||||
}
|
||||
return req;
|
||||
|
||||
// Hydrate childRequests (common for Ombi TV show requests)
|
||||
if (Array.isArray(result.childRequests) && result.childRequests.length > 0) {
|
||||
const hydratedChildren = result.childRequests.map(child => {
|
||||
if (!child) return child;
|
||||
|
||||
const childUserId = child.requestedUserId || child.RequestedUserId;
|
||||
if (childUserId && this.cache.userMap.has(childUserId)) {
|
||||
const cachedUser = this.cache.userMap.get(childUserId);
|
||||
let childUser = child.requestedUser || child.RequestedUser;
|
||||
|
||||
if (!childUser || typeof childUser !== 'object' || Object.keys(childUser).length === 0) {
|
||||
const hydratedUser = {
|
||||
id: cachedUser.id,
|
||||
userName: cachedUser.userName,
|
||||
alias: cachedUser.alias || cachedUser.Alias || '',
|
||||
userAlias: cachedUser.userAlias || cachedUser.UserAlias || '',
|
||||
normalizedUserName: cachedUser.normalizedUserName || cachedUser.NormalizedUserName || ''
|
||||
};
|
||||
|
||||
return {
|
||||
...child,
|
||||
requestedUser: hydratedUser,
|
||||
RequestedUser: hydratedUser
|
||||
};
|
||||
}
|
||||
}
|
||||
return child;
|
||||
});
|
||||
|
||||
result = { ...result, childRequests: hydratedChildren };
|
||||
}
|
||||
|
||||
// Promote requestedDate from childRequests to top level (common for Ombi TV)
|
||||
if (!result.requestedDate && Array.isArray(result.childRequests) && result.childRequests.length > 0) {
|
||||
const childDate = result.childRequests[0].requestedDate || result.childRequests[0].RequestedDate;
|
||||
if (childDate) {
|
||||
result = { ...result, requestedDate: childDate };
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -249,7 +249,7 @@ app.use(express.json({ limit: '64kb' })); // prevent oversized JSON payloads
|
||||
* version:
|
||||
* type: string
|
||||
* description: sofarr version
|
||||
* example: "1.7.24"
|
||||
* example: "1.7.25"
|
||||
*/
|
||||
app.get('/health', (req, res) => {
|
||||
res.json({ status: 'ok', uptime: process.uptime(), version });
|
||||
|
||||
@@ -17,6 +17,23 @@ function getRequestStatus(request) {
|
||||
if (request.denied) return 'denied';
|
||||
if (request.approved) return 'approved';
|
||||
if (request.requested) return 'pending';
|
||||
|
||||
// Ombi TV requests store status flags inside childRequests
|
||||
if (Array.isArray(request.childRequests) && request.childRequests.length > 0) {
|
||||
for (const child of request.childRequests) {
|
||||
if (child && child.available) return 'available';
|
||||
}
|
||||
for (const child of request.childRequests) {
|
||||
if (child && child.denied) return 'denied';
|
||||
}
|
||||
for (const child of request.childRequests) {
|
||||
if (child && child.approved) return 'approved';
|
||||
}
|
||||
for (const child of request.childRequests) {
|
||||
if (child && child.requested) return 'pending';
|
||||
}
|
||||
}
|
||||
|
||||
return 'unknown';
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user