-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathschema.sql
More file actions
166 lines (145 loc) · 4.68 KB
/
Copy pathschema.sql
File metadata and controls
166 lines (145 loc) · 4.68 KB
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
CREATE TABLE IF NOT EXISTS images (
id TEXT PRIMARY KEY,
filename TEXT NOT NULL,
ext TEXT NOT NULL,
width INTEGER,
height INTEGER,
size_bytes INTEGER,
r2_key_orig TEXT,
r2_key_web TEXT,
r2_key_thumb TEXT,
sync_status TEXT DEFAULT 'pending',
description TEXT,
tags TEXT,
metadata_device_id TEXT,
metadata_model TEXT,
metadata_at INTEGER,
metadata_claim_device_id TEXT,
metadata_claimed_at INTEGER,
blur_data_url TEXT,
blur_claim_device_id TEXT,
blur_claimed_at INTEGER,
exif_aperture TEXT,
exif_shutter_speed TEXT,
exif_iso INTEGER,
exif_focal_length TEXT,
exif_metering_mode TEXT,
exif_matrix_metering TEXT,
exif_spot_metering TEXT,
exif_exposure_compensation TEXT,
exif_flash TEXT,
uploaded_at INTEGER NOT NULL,
uploaded_day TEXT,
uploaded_day_seq INTEGER,
synced_at INTEGER
);
CREATE INDEX IF NOT EXISTS idx_uploaded_at ON images(uploaded_at DESC);
CREATE INDEX IF NOT EXISTS idx_sync_status ON images(sync_status);
CREATE TABLE IF NOT EXISTS image_likes (
image_id TEXT NOT NULL,
viewer_key TEXT NOT NULL,
created_at INTEGER NOT NULL,
PRIMARY KEY (image_id, viewer_key)
);
CREATE INDEX IF NOT EXISTS idx_image_likes_image_id ON image_likes(image_id);
CREATE TABLE IF NOT EXISTS image_like_counts (
image_id TEXT PRIMARY KEY,
count INTEGER NOT NULL DEFAULT 0
);
CREATE INDEX IF NOT EXISTS idx_uploaded_day ON images(uploaded_day, uploaded_day_seq);
CREATE TABLE IF NOT EXISTS upload_days (
day TEXT PRIMARY KEY,
next_seq INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS runtime_state (
key TEXT PRIMARY KEY,
value TEXT NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS devices (
id TEXT PRIMARY KEY,
name TEXT,
tunnel_url TEXT,
last_seen_at INTEGER NOT NULL,
created_at INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_devices_seen ON devices(last_seen_at DESC);
CREATE TABLE IF NOT EXISTS image_devices (
image_id TEXT NOT NULL,
device_id TEXT NOT NULL,
sha256 TEXT,
synced_at INTEGER NOT NULL,
PRIMARY KEY (image_id, device_id)
);
CREATE INDEX IF NOT EXISTS idx_image_devices_device ON image_devices(device_id, synced_at DESC);
CREATE TABLE IF NOT EXISTS image_comments (
id TEXT PRIMARY KEY,
image_id TEXT NOT NULL,
root_id TEXT NOT NULL,
parent_id TEXT,
nickname TEXT NOT NULL,
markdown TEXT NOT NULL,
rendered_html TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'visible',
user_id TEXT,
edit_count INTEGER NOT NULL DEFAULT 0,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_comments_image ON image_comments(image_id, created_at);
CREATE INDEX IF NOT EXISTS idx_comments_user ON image_comments(user_id);
CREATE INDEX IF NOT EXISTS idx_comments_root ON image_comments(root_id, created_at);
CREATE TABLE IF NOT EXISTS comment_likes (
comment_id TEXT NOT NULL,
viewer_key TEXT NOT NULL,
created_at INTEGER NOT NULL,
PRIMARY KEY (comment_id, viewer_key)
);
CREATE INDEX IF NOT EXISTS idx_comment_likes_comment ON comment_likes(comment_id);
CREATE TABLE IF NOT EXISTS comment_like_counts (
comment_id TEXT PRIMARY KEY,
count INTEGER NOT NULL DEFAULT 0
);
CREATE TABLE IF NOT EXISTS comment_rate_limits (
identity_hash TEXT PRIMARY KEY,
last_post_at INTEGER NOT NULL,
ten_min_started_at INTEGER NOT NULL,
ten_min_count INTEGER NOT NULL,
day_started_at INTEGER NOT NULL,
day_count INTEGER NOT NULL,
expires_at INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS comment_nickname_cooldowns (
identity_hash TEXT PRIMARY KEY,
nickname TEXT NOT NULL,
nickname_changed_at INTEGER,
expires_at INTEGER NOT NULL
);
-- Comment-UI accounts. Sessions / email codes / oauth state are in KV.
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY,
username TEXT,
username_lower TEXT,
email TEXT,
email_lower TEXT,
email_verified INTEGER NOT NULL DEFAULT 0,
password_hash TEXT,
badge TEXT NOT NULL DEFAULT 'seal',
display_name TEXT,
avatar_key TEXT,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email_lower
ON users(email_lower) WHERE email_lower IS NOT NULL;
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_username_lower
ON users(username_lower) WHERE username_lower IS NOT NULL;
CREATE TABLE IF NOT EXISTS user_oauth (
provider TEXT NOT NULL,
provider_account_id TEXT NOT NULL,
user_id TEXT NOT NULL,
email TEXT,
created_at INTEGER NOT NULL,
PRIMARY KEY (provider, provider_account_id)
);
CREATE INDEX IF NOT EXISTS idx_user_oauth_user ON user_oauth(user_id);