summaryrefslogtreecommitdiffstats
path: root/src/dataservices/feed.service.ts
blob: b97d5d2af5a3d3a82bcae8b1de1cc0ae93942887 (plain)
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
89
90
91
92
93
94
95
96
97
import { AxiosResponse } from 'axios'
import axios from '@nextcloud/axios'

import { API_ROUTES } from '../types/ApiRoutes'

export enum FEED_ORDER {
	OLDEST = 1,
	NEWEST = 0,
	DEFAULT = 2,
}

export enum FEED_UPDATE_MODE {
	IGNORE = 1,
	UNREAD = 0,
}

export class FeedService {

	/**
	 * Retrieves all Feed info from the Nextcloud News backend
	 *
	 * @return {AxiosResponse} Feed info stored in array property data.feeds
	 */
	static fetchAllFeeds(): Promise<AxiosResponse> {
		return axios.get(API_ROUTES.FEED)
	}

	/**
	 * Attempts to add a feed to the Nextcloud News backend
	 * NOTE: this can fail if feed URL is not resolvable
	 *
	 * @param param0 Data for the feed
	 * @param param0.url {String} url of the feed to add
	 * @param param0.folderId {number} id number of folder to add feed to
	 * @param param0.user {String} http auth username required for accessing feed
	 * @param param0.password {String} http auth password required for accessing feed
	 * @return {AxiosResponse} Feed info stored in data.feeds[0] property
	 */
	static addFeed({ url, folderId, user, password }: { url: string; folderId: number; user?: string; password?: string }): Promise<AxiosResponse> {
		return axios.post(API_ROUTES.FEED, {
			url,
			parentFolderId: folderId,
			title: null, // TODO: let user define feed title on create?
			user: user || null,
			password: password || null,
			fullDiscover: undefined, // TODO: autodiscover?
		})
	}

	/**
	 * Marks all items in feed, started with highestReadId
	 *
	 * @param param0 Data for the feed
	 * @param param0.feedId {Number} ID number of feed to mark items as read
	 * @param param0.highestItemId {Number} ID number of the (most recent?) feed item to mark as read (all older items will be marked as read)
	 * @return {AxiosResponse} Updated feed info (unreadCount = 0) stored in data.feeds[0] property
	 */
	static markRead({ feedId, highestItemId }: { feedId: number, highestItemId: number }): Promise<AxiosResponse> {
		return axios.post(API_ROUTES.FEED + `/${feedId}/read`, {
			highestItemId,
		})
	}

	/**
	 * Update a feeds properties
	 *
	 * @param param0 Data for the feed
	 * @param param0.feedId {Number} ID number of feed to update
	 * @param param0.pinned {Boolean} should be pinned (true) or not pinned (flse)
	 * @param param0.ordering {FEED_ORDER} sets feed order (0 = NEWEST, 1 = OLDEST, 2 = DEFAULT)
	 * @param param0.fullTextEnabled {Boolean} should be full text be enabled (true) or not (flse)
	 * @param param0.updateMode {FEED_UPDATE_MODE} sets updateMode (0 = UNREAD, 1 = IGNORE)
	 * @param param0.title {String} title of feed to display
	 * @return {AxiosResponse} Null value is returned on success
	 */
	static updateFeed({ feedId, pinned, ordering, fullTextEnabled, updateMode, title }: { feedId: number, pinned?: boolean, ordering?: FEED_ORDER, fullTextEnabled?: boolean, updateMode?: FEED_UPDATE_MODE, title?: string }): Promise<AxiosResponse> {
		return axios.patch(API_ROUTES.FEED + `/${feedId}`, {
			pinned,
			ordering,
			fullTextEnabled,
			updateMode,
			title,
		})
	}

	/**
	 * Deletes a feed
	 *
	 * @param param0 Data for the feed
	 * @param param0.feedId {Number} ID number of feed to delete
	 * @return {AxiosResponse} Null value is returned on success
	 */
	static deleteFeed({ feedId }: { feedId: number }): Promise<AxiosResponse> {
		return axios.delete(API_ROUTES.FEED + `/${feedId}`)
	}

}