|
@@ -119,7 +119,7 @@ async function buildAccessList(app, accessIds) {
|
|
|
result.fromDb(data);
|
|
result.fromDb(data);
|
|
|
return result;
|
|
return result;
|
|
|
});
|
|
});
|
|
|
- return accessList || [];
|
|
|
|
|
|
|
+ return (accessList || []).filter(i => i.grant !== ACCESS_GRANT.none);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function reduceReqToMediaStruct(acc, i) {
|
|
function reduceReqToMediaStruct(acc, i) {
|
|
@@ -142,7 +142,65 @@ module.exports.fetchOne = async function(app, md5sum, accessList) {
|
|
|
return result?.HaveAccess(accessList) ? result : null;
|
|
return result?.HaveAccess(accessList) ? result : null;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-module.exports.fetchMedias = async function(app, startTs, count) {
|
|
|
|
|
|
|
+function fetchAccessSubQuery(args, access) {
|
|
|
|
|
+ let result = [];
|
|
|
|
|
+ if (access.filter(i => i.accessTo === ACCESS_TO.everything).length) return "1=1";
|
|
|
|
|
+ for (let i of access) {
|
|
|
|
|
+ if (i.accessTo === ACCESS_TO.item) {
|
|
|
|
|
+ result.push(`fixedSum=?`);
|
|
|
|
|
+ args.push(i.accessToData);
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (i.accessTo === ACCESS_TO.meta && i.accessToDataDeserialized) {
|
|
|
|
|
+ result.push('(mediaMeta.key=? and mediaMeta.value=?)');
|
|
|
|
|
+ const metaKey = Object.keys(i.accessToDataDeserialized)[0];
|
|
|
|
|
+ args.push(metaKey);
|
|
|
|
|
+ args.push(i.accessToDataDeserialized[metaKey]);
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (i.accessTo === ACCESS_TO.tag && i.accessToData) {
|
|
|
|
|
+ result.push('(mediaTag.tag=? or mediaTag.tag like ?)');
|
|
|
|
|
+ args.push(i.accessToData);
|
|
|
|
|
+ args.push(`${i.accessToData}/%`);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return result.join(" or ") || "1=0";
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function fetchMediasBuildSubQuery(startTs, count, access) {
|
|
|
|
|
+ let query = "select distinct fixedSum from mediaFile";
|
|
|
|
|
+ let whereClause = ' where 1=1';
|
|
|
|
|
+ let accessWhere = null;
|
|
|
|
|
+ let args = [];
|
|
|
|
|
+
|
|
|
|
|
+ // access filter
|
|
|
|
|
+ if (access !== undefined) {
|
|
|
|
|
+ accessWhere = fetchAccessSubQuery(args, access);
|
|
|
|
|
+
|
|
|
|
|
+ // join
|
|
|
|
|
+ if (accessWhere)
|
|
|
|
|
+ query += ` left join mediaMeta on mediaMeta.md5sum=mediaFile.fixedSum` +
|
|
|
|
|
+ ` left join mediaTag on mediaTag.md5sum=mediaFile.fixedSum`;
|
|
|
|
|
+
|
|
|
|
|
+ if (accessWhere)
|
|
|
|
|
+ whereClause += ` and (${accessWhere})`;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // date filter
|
|
|
|
|
+ if (startTs) {
|
|
|
|
|
+ whereClause += ' and date <?'
|
|
|
|
|
+ args.push(startTs);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // order and limit
|
|
|
|
|
+ query += whereClause + " order by date desc limit ?";
|
|
|
|
|
+ args.push(count);
|
|
|
|
|
+ return {
|
|
|
|
|
+ query: query,
|
|
|
|
|
+ args: args
|
|
|
|
|
+ };
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+module.exports.fetchMedias = async function(app, startTs, count, access) {
|
|
|
|
|
+ let subQuery = fetchMediasBuildSubQuery(startTs, count, access);
|
|
|
let result = ((await app.databaseHelper.runSql(`
|
|
let result = ((await app.databaseHelper.runSql(`
|
|
|
select mediaFile.path, mediaFile.md5sum, mediaFile.date, mediaFile.fixedSum,
|
|
select mediaFile.path, mediaFile.md5sum, mediaFile.date, mediaFile.fixedSum,
|
|
|
mediaMeta.key as metaKey, mediaMeta.value as metaValue,
|
|
mediaMeta.key as metaKey, mediaMeta.value as metaValue,
|
|
@@ -150,10 +208,7 @@ module.exports.fetchMedias = async function(app, startTs, count) {
|
|
|
from mediaFile
|
|
from mediaFile
|
|
|
left join mediaMeta on mediaMeta.md5sum=mediaFile.fixedSum
|
|
left join mediaMeta on mediaMeta.md5sum=mediaFile.fixedSum
|
|
|
left join mediaTag on mediaTag.md5sum=mediaFile.fixedSum
|
|
left join mediaTag on mediaTag.md5sum=mediaFile.fixedSum
|
|
|
- where mediaFile.fixedSum in
|
|
|
|
|
- (select fixedSum from mediaFile `
|
|
|
|
|
- +(startTs ? "where date <? " : "")
|
|
|
|
|
- +"order by date desc limit ?)", startTs ? [startTs, count] : [count])) || [])
|
|
|
|
|
|
|
+ where mediaFile.fixedSum in (${subQuery.query})`, subQuery.args)) || [])
|
|
|
.reduce(reduceReqToMediaStruct, {});
|
|
.reduce(reduceReqToMediaStruct, {});
|
|
|
|
|
|
|
|
result = Object.keys(result).map(i => result[i]).sort((a, b) => b.date-a.date);
|
|
result = Object.keys(result).map(i => result[i]).sort((a, b) => b.date-a.date);
|
|
@@ -166,7 +221,7 @@ module.exports.fetchMediasWithAccess = async function(app, startTs, count, acces
|
|
|
|
|
|
|
|
access = await buildAccessList(app, access);
|
|
access = await buildAccessList(app, access);
|
|
|
while (result.length < count) {
|
|
while (result.length < count) {
|
|
|
- let tmp = await module.exports.fetchMedias(app, lastTs, 25);
|
|
|
|
|
|
|
+ let tmp = await module.exports.fetchMedias(app, lastTs, 25, access);
|
|
|
if (!tmp.length)
|
|
if (!tmp.length)
|
|
|
return result;
|
|
return result;
|
|
|
lastTs = tmp[tmp.length-1].date;
|
|
lastTs = tmp[tmp.length-1].date;
|