201 lines
4.8 KiB
TypeScript
201 lines
4.8 KiB
TypeScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
/* eslint-disable @typescript-eslint/no-empty-interface */
|
|
// Generated by https://quicktype.io
|
|
//
|
|
// To change quicktype's target language, run command:
|
|
//
|
|
// "Set quicktype target language"
|
|
import fetch from 'node-fetch'
|
|
|
|
|
|
// Types
|
|
|
|
export interface Board {
|
|
title: string;
|
|
owner: User;
|
|
color: string;
|
|
archived: boolean;
|
|
labels: Label[];
|
|
acl: any[];
|
|
permissions: {
|
|
PERMISSION_READ: boolean;
|
|
PERMISSION_EDIT: boolean;
|
|
PERMISSION_MANAGE: boolean;
|
|
PERMISSION_SHARE: boolean;
|
|
};
|
|
users: User[];
|
|
shared: number;
|
|
deletedAt: number;
|
|
id: number;
|
|
lastModified: number;
|
|
}
|
|
|
|
export interface Stack {
|
|
title: string;
|
|
boardId: number;
|
|
deletedAt: number;
|
|
lastModified: number;
|
|
cards: Card[];
|
|
order: number;
|
|
id: number;
|
|
}
|
|
|
|
export interface Card {
|
|
title: string;
|
|
description: string;
|
|
stackId: number;
|
|
type: "plain";
|
|
lastModified: number;
|
|
createdAt: number;
|
|
labels: Label[];
|
|
assignedUsers: unknown;
|
|
attachments: unknown;
|
|
attachmentCount: unknown;
|
|
owner: string;
|
|
order: number;
|
|
archived: boolean;
|
|
duedate: string;
|
|
deletedAt: number;
|
|
commentsUnread: number;
|
|
commentsCount: number;
|
|
comments?: Comment[]
|
|
id: number;
|
|
overdue: number;
|
|
}
|
|
|
|
export interface CommentResponse {
|
|
ocs: {
|
|
meta: {
|
|
status: string;
|
|
statuscode: number;
|
|
message: string;
|
|
};
|
|
data: Comment[];
|
|
};
|
|
}
|
|
|
|
export interface Comment {
|
|
id: number;
|
|
objectId: number;
|
|
message: string;
|
|
actorId: string;
|
|
actorType: string;
|
|
actorDisplayName: string;
|
|
creationDateTime: string;
|
|
mentions: [
|
|
{
|
|
mentionId: string;
|
|
mentionType: string;
|
|
mentionDisplayName: string;
|
|
}
|
|
];
|
|
replyTo?: Comment;
|
|
}
|
|
|
|
export interface Label {
|
|
title: string;
|
|
color: string;
|
|
cardId: any;
|
|
id: number;
|
|
}
|
|
|
|
export interface User {
|
|
primaryKey: string;
|
|
uid: string;
|
|
displayname: string;
|
|
}
|
|
|
|
export interface NextcloudDeckClientConfig {
|
|
url: string
|
|
auth: Auth
|
|
}
|
|
|
|
export interface Auth {
|
|
username: string
|
|
password: string
|
|
}
|
|
|
|
// api
|
|
|
|
export const defaultHeaders = {
|
|
"OCS-APIRequest": "true",
|
|
"Content-Type": "application/json",
|
|
"Accept": "application/json",
|
|
}
|
|
|
|
export class NextcloudDeckClient {
|
|
|
|
config: NextcloudDeckClientConfig
|
|
|
|
/**
|
|
* Create a new Nextcloud Deck client
|
|
*/
|
|
constructor(config: NextcloudDeckClientConfig) {
|
|
this.config = config
|
|
}
|
|
|
|
async fetchWrapper(path: string): Promise<any> {
|
|
const response = await fetch(`${this.config.url}/index.php/apps/deck/api/v1.0/${path}`,
|
|
{
|
|
method: "GET",
|
|
headers: {
|
|
...defaultHeaders,
|
|
"Authorization": 'Basic ' + Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString('base64')
|
|
}
|
|
})
|
|
if (!response.ok) {
|
|
throw new Error(`Request failed with info: ${await response.text()}`)
|
|
}
|
|
return await response.json()
|
|
}
|
|
async fetchWrapperOCS(path: string): Promise<any> {
|
|
const response = await fetch(`${this.config.url}/ocs/v2.php/apps/deck/api/v1.0/${path}`,
|
|
{
|
|
method: "GET",
|
|
headers: {
|
|
...defaultHeaders,
|
|
"Authorization": 'Basic ' + Buffer.from(`${this.config.auth.username}:${this.config.auth.password}`).toString('base64')
|
|
}
|
|
})
|
|
if (!response.ok) {
|
|
throw new Error(`Request failed with info: ${await response.text()}`)
|
|
}
|
|
return await response.json()
|
|
}
|
|
|
|
async getBoards(): Promise<Board[]> {
|
|
return await this.fetchWrapper('boards')
|
|
}
|
|
|
|
async getBoardDetails(boardId: number): Promise<Board> {
|
|
return await this.fetchWrapper(`boards/${boardId}`)
|
|
|
|
}
|
|
|
|
async getStacks(boardId: number): Promise<Stack[]> {
|
|
return await this.fetchWrapper(`boards/${boardId}/stacks`)
|
|
|
|
}
|
|
|
|
async getStacksArchived(boardId: number): Promise<Stack[]> {
|
|
return await this.fetchWrapper(`boards/${boardId}/stacks/archived`)
|
|
|
|
}
|
|
|
|
async getStackDetails(boardId: number, stackId: number): Promise<Stack> {
|
|
return await this.fetchWrapper(`boards/${boardId}/stacks/${stackId}`)
|
|
|
|
}
|
|
|
|
async getCardDetails(boardId: number, stackId: number, cardId: number): Promise<Card[]> {
|
|
return await this.fetchWrapper(`boards/${boardId}/stacks/${stackId}/cards/${cardId}`)
|
|
|
|
}
|
|
|
|
async getComments(cardId: number): Promise<Comment[]> {
|
|
const response = await this.fetchWrapperOCS(`cards/${cardId}/comments`) as CommentResponse
|
|
return response.ocs.data
|
|
}
|
|
}
|
|
|