src/lib/scheme.ts 1.4 K raw
1
import * as Evolu from "@evolu/common";
2
3
// RSS Feed ID
4
const RSSFeedId = Evolu.id("RSSFeed");
5
export type RSSFeedId = typeof RSSFeedId.Type;
6
7
// RSS Post ID
8
const RSSPostId = Evolu.id("RSSPost");
9
export type RSSPostId = typeof RSSPostId.Type;
10
11
// Custom branded types for string length constraints
12
const NonEmptyString50 = Evolu.maxLength(50)(Evolu.NonEmptyString);
13
const NonEmptyString200 = Evolu.maxLength(200)(Evolu.NonEmptyString);
14
15
export const Schema = {
16
	rssFeed: {
17
		id: RSSFeedId,
18
		feedUrl: Evolu.NonEmptyString1000,
19
		title: NonEmptyString200,
20
		description: Evolu.nullOr(Evolu.NonEmptyString1000),
21
		category: Evolu.nullOr(NonEmptyString50),
22
		dateUpdated: Evolu.nullOr(Evolu.NonEmptyString),
23
	},
24
	rssPost: {
25
		id: RSSPostId,
26
		feedId: RSSFeedId,
27
		title: Evolu.NonEmptyString1000,
28
		link: Evolu.NonEmptyString1000,
29
		content: Evolu.nullOr(Evolu.NonEmptyString),
30
		author: Evolu.nullOr(NonEmptyString200),
31
		feedTitle: Evolu.nullOr(NonEmptyString200),
32
		publishedDate: Evolu.nullOr(Evolu.NonEmptyString),
33
	},
34
	readStatus: {
35
		id: Evolu.id("ReadStatus"),
36
		feedId: RSSFeedId,
37
		postId: RSSPostId,
38
		isRead: Evolu.nullOr(Evolu.Number), // 0 for false, 1 for true
39
	},
40
	userPreferences: {
41
		id: Evolu.id("UserPreferences"),
42
		theme: Evolu.nullOr(NonEmptyString50), // Will store "light" or "dark"
43
		refreshInterval: Evolu.nullOr(NonEmptyString50), // Will store number as string
44
		postsPerPage: Evolu.nullOr(NonEmptyString50), // Will store number as string
45
	},
46
};