-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapi-redirect-logic.js
88 lines (67 loc) · 3.49 KB
/
api-redirect-logic.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import {
datasetBranchCommitMapping,
getAllowedDatasetEntryFromSlug,
getDefaultCommit,
getDefaultBranch
} from "./datasetManagement.js";
import { recordEvent } from "./event-analytics.js";
import errors from "./api-errors.js";
export default async function redirectLogic({params, queryString, type, referer="", redirectPrefix = "", redirectSuffix = "", getValidationError, callback}) {
const {datasetSlug, branch, commit, asset} = params;
const eventTemplate = {type, asset, datasetSlug, branch, commit, queryString, referer};
const knownErrors = errors(datasetSlug, branch, commit);
function error(err, cacheControl = "no-store, max-age=0"){
const knownError = knownErrors[err];
if (!err.stack && knownError && knownError.length === 3) {
// known error
const [status, shortMessage, messageExtra] = knownError;
recordEvent({...eventTemplate, status, comment: shortMessage});
return {status, error: `${shortMessage} ${messageExtra}`, cacheControl};
} else if (typeof err === "string"
&& (err.includes("Too many query structure errors") || err.includes("Too many query definition errors"))) {
// hardcoded known error from ddf-query-validator inside DDFCSV reader
recordEvent({...eventTemplate, status: 400, comment: err});
return {status: 400, error: `${err}`, cacheControl};
} else {
// unknown error
recordEvent({...eventTemplate, status: 500, comment: err.message ? err.message : err, stack:err.stack});
return {status: 500, error: err.message ? err.message : err, cacheControl};
}
}
function redirect(target, cacheControl = "public, s-maxage=300, max-age=300") {
return {status: 302, redirect: `${target}${queryString?"?"+queryString:""}`, cacheControl};
}
function success(data, cacheControl = "public, s-maxage=31536000, max-age=14400"){
return {status: 200, success: data, cacheControl};
}
if(!datasetSlug)
return error("NO_DATASET_GIVEN");
if(!getAllowedDatasetEntryFromSlug(datasetSlug))
return error("DATASET_NOT_ALLOWED");
const branchCommitMapping = datasetBranchCommitMapping[datasetSlug];
if (!branchCommitMapping)
return error("DATASET_NOT_FOUND");
const validationError = getValidationError && getValidationError();
if (validationError)
return error(validationError)
// Redirect if branch not given ot unknown
// Both cases to default branch and default commit
if (!branch || !branchCommitMapping[branch] ) {
const defaultBranch = getDefaultBranch(datasetSlug);
const defaultCommit = getDefaultCommit(datasetSlug);
if (defaultBranch === false || defaultCommit === false)
return error("DEFAULT_COMMIT_NOT_RESOLVED");
return redirect(redirectPrefix + defaultBranch + "/" + defaultCommit.substr(0,7) + redirectSuffix);
}
// Redirect if commit not given ot unknown
// Both cases to default commit
if (!commit || !Object.values(branchCommitMapping).find(f => f === commit || f.substr(0,7) === commit) ) {
const defaultCommit = branchCommitMapping[branch];
if (defaultCommit === false)
return error("DEFAULT_COMMIT_NOT_RESOLVED");
return redirect(redirectPrefix + branch + "/" + defaultCommit.substr(0,7) + redirectSuffix);
}
//datasetSlug is allowed and found among datasets
//branchOrCommit is a known commit
return callback({success, redirect, error});
}