|
|
@@ -97,21 +97,12 @@ function listProjects(token, index) {
|
|
|
return { error: 'Missing portal_id in plugin config. Run resolve_portal first.' };
|
|
|
}
|
|
|
|
|
|
- var url = API_BASE + '/restapi/portal/' + portalId + '/projects/?index=' + encodeURIComponent(String(index));
|
|
|
- var headers = { 'Authorization': 'Zoho-oauthtoken ' + token };
|
|
|
-
|
|
|
- var resp = shadowman.http.request(url, { method: 'GET', headers: headers });
|
|
|
-
|
|
|
- if (resp.status === 401) {
|
|
|
- var auth = require('./auth');
|
|
|
- var newToken = auth.getValidToken();
|
|
|
- if (!newToken) return { error: 'Authentication expired and refresh failed. Re-run setup_auth.' };
|
|
|
- headers['Authorization'] = 'Zoho-oauthtoken ' + newToken;
|
|
|
- resp = shadowman.http.request(url, { method: 'GET', headers: headers });
|
|
|
- }
|
|
|
+ var params = {};
|
|
|
+ if (index) params.index = String(index);
|
|
|
|
|
|
- if (resp.status >= 400) return { error: 'Zoho API error (' + resp.status + '): ' + resp.body };
|
|
|
- try { return JSON.parse(resp.body); } catch (e) { return { error: 'Invalid JSON: ' + resp.body }; }
|
|
|
+ return apiCall(token, 'GET',
|
|
|
+ '/api/v3/portal/{PORTALID}/projects'
|
|
|
+ .replace('{PORTALID}', portalId), null, params);
|
|
|
}
|
|
|
|
|
|
// --- Tasks (v3) ---
|
|
|
@@ -290,16 +281,59 @@ function logTime(token, projectId, args) {
|
|
|
.replace('{PROJECTID}', projectId), body);
|
|
|
}
|
|
|
|
|
|
+function getProject(token, projectId) {
|
|
|
+ var portalId = shadowman.config.value('portal_id');
|
|
|
+ if (!portalId) return { error: 'Missing portal_id' };
|
|
|
+ return apiCall(token, 'GET',
|
|
|
+ '/api/v3/portal/{PORTALID}/projects/{PROJECTID}'
|
|
|
+ .replace('{PORTALID}', portalId)
|
|
|
+ .replace('{PROJECTID}', projectId), null, {});
|
|
|
+}
|
|
|
+
|
|
|
function listTimesheets(token, projectId, filters) {
|
|
|
- var params = {};
|
|
|
- if (filters.task_id) params.task_id = String(filters.task_id);
|
|
|
- if (filters.from_date) params.from_date = filters.from_date;
|
|
|
- if (filters.to_date) params.to_date = filters.to_date;
|
|
|
- if (filters.index) params.index = String(filters.index);
|
|
|
+ var portalId = shadowman.config.value('portal_id');
|
|
|
+ if (!portalId) return { error: 'Missing portal_id in plugin config.' };
|
|
|
|
|
|
- return apiCall(token, 'GET',
|
|
|
- '/api/v3/portal/{PORTALID}/projects/{PROJECTID}/logs'
|
|
|
- .replace('{PROJECTID}', projectId), null, params);
|
|
|
+ var params = {
|
|
|
+ view_type: 'customdate'
|
|
|
+ };
|
|
|
+
|
|
|
+ if (filters.from_date) {
|
|
|
+ var parts = filters.from_date.split('-');
|
|
|
+ if (parts.length === 3) params.start_date = parts[2] + '-' + parts[0] + '-' + parts[1];
|
|
|
+ else params.start_date = filters.from_date;
|
|
|
+ } else {
|
|
|
+ var d = new Date();
|
|
|
+ d.setDate(d.getDate() - 30);
|
|
|
+ params.start_date = d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0');
|
|
|
+ }
|
|
|
+
|
|
|
+ if (filters.to_date) {
|
|
|
+ var parts = filters.to_date.split('-');
|
|
|
+ if (parts.length === 3) params.end_date = parts[2] + '-' + parts[0] + '-' + parts[1];
|
|
|
+ else params.end_date = filters.to_date;
|
|
|
+ } else {
|
|
|
+ var today = new Date();
|
|
|
+ params.end_date = today.getFullYear() + '-' + String(today.getMonth() + 1).padStart(2, '0') + '-' + String(today.getDate()).padStart(2, '0');
|
|
|
+ }
|
|
|
+
|
|
|
+ if (filters.index) params.page = String(filters.index);
|
|
|
+
|
|
|
+ if (filters.task_id) {
|
|
|
+ params.module = JSON.stringify({ id: String(filters.task_id), type: 'task' });
|
|
|
+ } else {
|
|
|
+ params.module = JSON.stringify({ type: 'task' });
|
|
|
+ }
|
|
|
+
|
|
|
+ var url = '/api/v3/portal/{PORTALID}/timelogs'.replace('{PORTALID}', portalId);
|
|
|
+ if (projectId) {
|
|
|
+ // Ha van projekt ID, a projekt szintű végpontot hívjuk
|
|
|
+ url = '/api/v3/portal/{PORTALID}/projects/{PROJECTID}/timelogs'
|
|
|
+ .replace('{PORTALID}', portalId)
|
|
|
+ .replace('{PROJECTID}', projectId);
|
|
|
+ }
|
|
|
+
|
|
|
+ return apiCall(token, 'GET', url, null, params);
|
|
|
}
|
|
|
|
|
|
function deleteTimesheet(token, projectId, logId) {
|