Skip to content

Commit e1d6fe1

Browse files
committed
Add Subscription Page
1 parent fbd7c47 commit e1d6fe1

File tree

17 files changed

+1145
-832
lines changed

17 files changed

+1145
-832
lines changed

dev/dev.sql

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -151,28 +151,25 @@ ADD COLUMN expired_at TIMESTAMP WITH TIME ZONE;
151151
ALTER TABLE connections
152152
ADD COLUMN expired_at TIMESTAMP WITH TIME ZONE;
153153

154+
===
154155

155156

156157
ALTER TABLE connections RENAME COLUMN user_id TO subscription_id;
157158

158159
CREATE TABLE subscriptions (
159160
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
160161
expires_at TIMESTAMP WITH TIME ZONE NOT NULL,
161-
162-
referral_code CHAR(12) UNIQUE,
163-
referred_by UUID REFERENCES subscriptions(id),
164-
165-
referral_count INTEGER DEFAULT 0,
166-
referral_bonus_days INTEGER DEFAULT 0,
167-
162+
referred_by CHAR(13),
163+
168164
created_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
169-
updated_at TIMESTAMP WITH TIME ZONE DEFAULT now()
165+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
166+
is_deleted BOOL NOT NULL DEFAULT false
170167
);
171168

172-
CREATE INDEX idx_subscriptions_user_id ON subscriptions(user_id);
173169
CREATE INDEX idx_subscriptions_expires_at ON subscriptions(expires_at);
174-
CREATE INDEX idx_subscriptions_referral_code ON subscriptions(referral_code);
175170
CREATE INDEX idx_subscriptions_referred_by ON subscriptions(referred_by);
176171

177-
ALTER TABLE subscriptions
178-
ADD COLUMN is_deleted BOOL NOT NULL DEFAULT false;
172+
173+
174+
175+

dev/user-state.html

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ <h3>Current Connections:</h3>
8181
<pre id="conns"></pre>
8282
</div>
8383

84+
<div id="subs-container" style="display:none;">
85+
<h3>Subscriptions</h3>
86+
<pre id="subs"></pre>
87+
</div>
88+
89+
8490
<script>
8591
let socket = null;
8692
let reconnectInterval = null;
@@ -95,6 +101,9 @@ <h3>Current Connections:</h3>
95101
const usersHeader = document.getElementById('users-header');
96102
const connElement = document.getElementById('conn-info');
97103
const connIdInput = document.getElementById('connId');
104+
const subsContainer = document.getElementById('subs-container');
105+
const subsElement = document.getElementById('subs');
106+
98107

99108
function buildWebSocketUrl({ host, port, ssl = true, path = '' }) {
100109
let protocol = ssl ? 'wss' : 'ws';
@@ -121,21 +130,18 @@ <h3>Current Connections:</h3>
121130
socket = new WebSocket(url, token); // token as subprotocol
122131

123132
socket.onopen = () => {
124-
console.log(`Connected to WebSocket server at ${url}`);
125-
clearInterval(reconnectInterval);
126133
requestConns();
127134
requestNodes();
128-
requestUsers();
129-
135+
requestSubscriptions();
136+
130137
setInterval(() => {
131-
if (socket && socket.readyState === WebSocket.OPEN) {
132-
requestConns();
133-
requestNodes();
134-
requestUsers();
135-
}
138+
requestConns();
139+
requestNodes();
140+
requestSubscriptions();
136141
}, 5000);
137142
};
138143

144+
139145
socket.onmessage = (event) => {
140146
const data = event.data;
141147
try {
@@ -147,6 +153,7 @@ <h3>Current Connections:</h3>
147153
case "nodes": displayNodes(response); break;
148154
case "conn": displayConnInfo(response); break;
149155
case "users": displayUsers(response); break;
156+
case "subs": displaySubs(response); break;
150157
default: console.log("Unknown response kind:", response.kind);
151158
}
152159
} catch (error) {
@@ -188,6 +195,15 @@ <h3>Current Connections:</h3>
188195
alert('Please enter a valid conn ID');
189196
}
190197
});
198+
199+
function requestSubscriptions() {
200+
if (socket && socket.readyState === WebSocket.OPEN) {
201+
socket.send(JSON.stringify({
202+
kind: "get_subscriptions",
203+
message: "Requesting subscriptions"
204+
}));
205+
}
206+
}
191207

192208
function requestConns() {
193209
if (socket && socket.readyState === WebSocket.OPEN) {
@@ -239,6 +255,27 @@ <h3>Current Connections:</h3>
239255
}
240256
}
241257

258+
function displaySubs(state) {
259+
subsContainer.style.display = 'block';
260+
subsElement.innerHTML = "";
261+
262+
let data = state.data;
263+
264+
if (Array.isArray(data)) {
265+
const ul = document.createElement('ul');
266+
data.forEach(sub => {
267+
const li = document.createElement('li');
268+
li.textContent =
269+
`ID: ${sub.id}, expires: ${sub.expires_at}, deleted: ${sub.is_deleted}, ref:_by ${sub.referred_by}`;
270+
ul.appendChild(li);
271+
});
272+
subsElement.appendChild(ul);
273+
} else {
274+
subsElement.textContent = JSON.stringify(state.data, null, 2);
275+
}
276+
}
277+
278+
242279
function displayNodes(state) {
243280
nodesContainer.style.display = 'block';
244281
nodesElement.innerHTML = "";

0 commit comments

Comments
 (0)