'use strict'; import Timedoctor from "./Timedoctor"; export type ProjectsQuery = { offset?: number, limit?: number, all?: 0|1, assigned?: 0|1, latest_first?: 0|1 } export type ProjectRespObj = { project_id: number, project_source: string, project_name: string, archived: boolean, url: string, users: number[] } export type ProjectsResponse = { count: string, url: string, offset: number, limit: string, projects: ProjectRespObj[] } /** * @class Projects * @property {Timedoctor} td * @property {function(start_date: Date, end_date: Date, params?)} get * @property {function(reasons, params?)} put */ export default class Projects { /** * @param td {Timedoctor} */ td: Timedoctor; constructor(td: Timedoctor) { this.td = td; } /** * Get projects list * @param user_id {string} * @param {{userId?: , offset?: number, limit?: number}} params * @return {Promise} return */ list(user_id: string, params: ProjectsQuery = {}) { let options = { uri: `/users/${user_id}/projects`, qs: params }; return this.td.query(options); } /** * Get a specific project * @param {string} user_id * @param {string} project_id * @return {Promise>} */ get(user_id: string, project_id: string) { let options = { uri: `/users/${user_id}/projects/${project_id}`, }; return this.td.query(options); } /** * Get a specific project * @param {string} user_id * @param {string} project_id * @return {Promise>} */ delete(user_id: string, project_id: string) { let options = { uri: `/users/${user_id}/projects/${project_id}`, method: "DELETE" }; return this.td.query(options); } /** * Create a project * @param {string} user_id * @param {string[]|} assign_users * @param name {string} Project name * @return {Promise>} */ create(user_id: string, assign_users: string[]|"include_all", name: string) { let body = { assign_users: Array.isArray(assign_users) ? assign_users.join(","):assign_users, project: { project_name: name } }; let options = { uri: `/users/${user_id}/projects`, method: "POST", body }; return this.td.query(options); } /** * Update a single project * * @param {string} user_id * @param {string[] | "include_all"} assign_users * @param {string} project_id * @param {string} name * @param {string} archived * @return {Promise>} */ update(user_id: string, assign_users: string[]|"include_all", project_id: string, name: string, archived?: boolean) { let project: {[k:string]:any} = { project_name: name }; if(archived !== undefined) { project.archived = archived ? "0" : "1"; } let body = { assign_users: Array.isArray(assign_users) ? assign_users.join(",") : assign_users, project }; let options = { uri: `/users/${user_id}/projects/${project_id}`, method: "PUT", body }; return this.td.query(options); } /** * Un-assign a user from a project * * @param {string} user_id * @param {string[] | "include_all"} assign_users * @param {string} project_id * @return {Promise>} */ unassign(user_id: string, assign_users: string[]|"include_all", project_id: string) { let body = { assign_users: Array.isArray(assign_users) ? assign_users.join(",") : assign_users, }; let options = { uri: `/users/${user_id}/projects/${project_id}/users`, method: "DELETE", body }; return this.td.query(options); } }