@jake-story/trellor
Version:
Trello service module
255 lines (254 loc) • 7.78 kB
JavaScript
'use strict';
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const request = __importStar(require("request"));
let props;
/**
*
* ().boards
* .get((Board[]))
* .add("board name", (Board))
* .find("board name", (Board[]))
*
* ().board("boardId")
* .get((Board))
* .remove()
* .clear()
* .lists
* .get((List[]))
* .add("list name", (List))
* .find("list name", (List[]))
*
* ().list("listId")
* .clear()
* .remove()
* .card("cardId")
* .remove()
* .cards
* .get((Card[]))
* .add("card name", (Card))
*
*/
class Trellor {
constructor(apiKey, apiToken) {
this.boards = new BoardsActor();
this.board = (id) => {
return new BoardActor(id);
};
this.list = (id) => {
return new ListActor(id);
};
props = {
apiKey: apiKey,
apiToken: apiToken
};
}
}
exports.Trellor = Trellor;
class BoardsActor {
constructor() {
this.get = () => {
return getBoards();
};
this.findAll = (name) => {
return findBoards(name);
};
this.find = (name) => __awaiter(this, void 0, void 0, function* () {
const boards = yield findBoards(name);
return new Promise((resolve, reject) => {
if (boards && boards.length)
resolve(boards[0]);
else
resolve();
// else reject()
});
});
this.add = (name) => {
return addBoard(name);
};
}
}
class ListsActor {
constructor(boardId) {
this.boardId = boardId;
this.get = () => {
return getLists(this.boardId);
};
this.add = (name) => {
return addList(this.boardId, name);
};
}
}
class BoardActor {
constructor(boardId) {
this.boardId = boardId;
this.get = () => {
return getBoard(this.boardId);
};
this.remove = () => {
return removeBoard(this.boardId);
};
this.clear = () => {
return new Promise((resolve, reject) => {
clearBoard(this.boardId, (result, error) => {
if (error)
reject(error);
else
resolve();
});
});
};
this.lists = new ListsActor(boardId);
}
}
class ListActor {
constructor(listId) {
this.listId = listId;
this.clear = () => {
return new Promise((resolve, reject) => {
clearList(this.listId, (result, error) => {
if (error)
reject(error);
else
resolve(result);
});
});
};
this.remove = () => {
return removeList(this.listId);
};
this.card = (cardId) => {
return new CardActor(cardId);
};
this.cards = new CardsActor(listId);
}
}
class CardsActor {
constructor(listId) {
this.listId = listId;
this.get = () => {
return getCards(this.listId);
};
this.add = (name) => {
return addCard(this.listId, name);
};
}
}
class CardActor {
constructor(id) {
this.id = id;
this.remove = () => {
return deleteCard(this.id);
};
}
}
/*
* PRIVATE FUNCTIONS
*/
function getBoards() {
return trelloAction("GET", "/1/members/me/boards", { fields: "name,lists", lists: "open" });
}
function getBoard(boardId) {
return trelloAction("GET", `/1/boards/${boardId}`, { fields: "name,lists", lists: "open", list_fields: "id,name" });
}
function findBoards(name, limit) {
return trelloAction("GET", `/1/search`, {
query: name,
partial: false,
modelTypes: "boards",
board_fields: "name,id",
boards_limit: limit || 1
}, "boards");
}
function removeBoard(boardId) {
return trelloAction("DELETE", `/1/boards/${boardId}`);
}
function clearBoard(boardId, callback) {
getBoard(boardId).then((board) => {
const doClear = (listIndex) => {
if (!board || !board.lists || listIndex === board.lists.length) {
callback.call(null);
return;
}
clearList(board.lists[listIndex].id, () => {
doClear(listIndex + 1);
});
};
doClear(0);
});
}
function addBoard(name) {
return trelloAction("POST", "/1/boards", { name: name, defaultLabels: false, defaultLists: false });
}
function getLists(boardId) {
return trelloAction("GET", `/1/boards/${boardId}/lists`, { fields: "id,name", filter: "open", cards: "open", card_fields: "id,name" });
}
function addList(boardId, name) {
return trelloAction("POST", "/1/lists", { name: name, idBoard: boardId });
}
function clearList(listId, callback) {
getCards(listId).then((cards) => {
const doCardDelete = (cardIndex) => {
if (!cards || cardIndex === cards.length) {
if (callback) {
callback.call(null);
}
return;
}
deleteCard(cards[cardIndex].id).then(() => {
doCardDelete(cardIndex + 1);
});
};
doCardDelete(0);
});
}
function removeList(listId) {
return trelloAction("PUT", `/1/lists/${listId}/closed`, { value: true });
}
function getCards(listId) {
return trelloAction("GET", `/1/lists/${listId}/cards`);
}
function addCard(listId, name) {
return trelloAction("POST", "/1/cards", { name: name, idList: listId });
}
function deleteCard(cardId) {
return trelloAction("DELETE", `/1/cards/${cardId}`);
}
function trelloAction(method, path, qs, key) {
if (!props.apiKey || !props.apiToken) {
throw Error("Service not initialized; API key and token not set.");
}
qs = qs || {};
qs.key = props.apiKey;
qs.token = props.apiToken;
const options = {
method: method,
uri: "https://api.trello.com" + path,
qs: qs,
json: true
};
return new Promise((resolve, reject) => {
request.default(options, (error, res, body) => {
if (error) {
console.log("TRELLO ERROR", JSON.stringify(error, null, 4));
resolve();
// reject(error)
}
resolve(key ? body[key] : body);
});
});
}