Skip to content

Commit 9b0830e

Browse files
committed
Can show data syncs between demos.
1 parent 067d126 commit 9b0830e

File tree

6 files changed

+61
-139
lines changed

6 files changed

+61
-139
lines changed

demos/TodoSQLite/Constants.cs

Lines changed: 0 additions & 17 deletions
This file was deleted.

demos/TodoSQLite/Data/NodeConnector.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class NodeConnector : IPowerSyncBackendConnector
1818

1919
public string BackendUrl { get; }
2020
public string PowerSyncUrl { get; }
21-
public string UserId { get; private set; }
21+
public string UserId { get; }
2222
private string? clientId;
2323

2424
public NodeConnector()
@@ -37,7 +37,7 @@ public NodeConnector()
3737
public string LoadOrGenerateUserId()
3838
{
3939

40-
return "78bb787c-ff0b-41b2-a297-6a7701648f4a";
40+
return "8ba3ec38-6cc8-449c-88c0-9275987ea5d2";
4141
}
4242

4343
public async Task<PowerSyncCredentials?> FetchCredentials()
Lines changed: 34 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
using System.IO;
2-
using Microsoft.Extensions.Logging;
3-
using Microsoft.Maui.Storage;
4-
using Newtonsoft.Json;
1+
using Microsoft.Extensions.Logging;
52
using PowerSync.Common.Client;
63
using PowerSync.Common.MDSQLite;
74
using PowerSync.Maui.SQLite;
8-
using SQLite;
95
using TodoSQLite.Models;
106

117
namespace TodoSQLite.Data;
@@ -15,20 +11,20 @@ public class PowerSyncData
1511
private PowerSyncDatabase _db;
1612
private ILogger _logger;
1713

18-
private record ListResult(string id, string name, string owner_id, string created_at);
19-
private record TodoResult(string id, string list_id, string description, string created_at, string completed_at, string created_by, string completed_by, int completed);
14+
public string UserId { get; set; } = "";
2015

16+
2117
async Task Init()
2218
{
2319
if (_db != null) return;
24-
20+
2521
ILoggerFactory loggerFactory = LoggerFactory.Create(builder =>
2622
{
2723
builder.AddConsole();
2824
builder.SetMinimumLevel(LogLevel.Trace);
2925
});
3026
_logger = loggerFactory.CreateLogger("PowerSyncLogger");
31-
27+
3228
var dbPath = Path.Combine(FileSystem.AppDataDirectory, "mydb.db");
3329
var factory = new MAUISQLiteDBOpenFactory(new MDSQLiteOpenFactoryOptions()
3430
{
@@ -42,130 +38,54 @@ async Task Init()
4238
});
4339
await _db.Init();
4440

45-
// var nodeConnector = new NodeConnector();
46-
// await _db.Connect(nodeConnector);
41+
var nodeConnector = new NodeConnector();
42+
UserId = nodeConnector.UserId;
43+
await _db.Connect(nodeConnector);
4744
}
4845

4946
// List operations
5047
public async Task<List<TodoList>> GetListsAsync()
5148
{
5249
await Init();
53-
var results = await _db.GetAll<ListResult>("SELECT * FROM lists ORDER BY created_at DESC");
54-
return results.Select(r => new TodoList
55-
{
56-
ID = r.id,
57-
Name = r.name,
58-
OwnerId = r.owner_id,
59-
CreatedAt = r.created_at
60-
}).ToList();
61-
}
62-
63-
public async Task<TodoList> GetListAsync(string id)
64-
{
65-
await Init();
66-
var result = await _db.GetAll<ListResult>("SELECT * FROM lists WHERE id = ?", [id.ToString()]);
67-
var list = result.FirstOrDefault();
68-
if (list == null) return null;
69-
70-
return new TodoList
71-
{
72-
ID = list.id,
73-
Name = list.name,
74-
OwnerId = list.owner_id,
75-
CreatedAt = list.created_at
76-
};
50+
var results = await _db.GetAll<TodoList>("SELECT * FROM lists ORDER BY created_at DESC");
51+
return results.ToList();
7752
}
7853

79-
public async Task<int> SaveListAsync(TodoList list)
54+
public async Task SaveListAsync(TodoList list)
8055
{
8156
await Init();
8257
if (list.ID != "")
8358
{
8459
await _db.Execute(
8560
"UPDATE lists SET name = ?, owner_id = ? WHERE id = ?",
86-
[list.Name, list.OwnerId, list.ID.ToString()]);
87-
return 1;
61+
[list.Name, UserId, list.ID]);
8862
}
8963
else
9064
{
9165
await _db.Execute(
9266
"INSERT INTO lists (id, name, owner_id, created_at) VALUES (uuid(), ?, ?, ?)",
93-
[list.Name, list.OwnerId, DateTime.UtcNow.ToString("o")]);
94-
return 1;
67+
[list.Name, UserId, DateTime.UtcNow.ToString("o")]);
9568
}
9669
}
9770

98-
public async Task<int> DeleteListAsync(TodoList list)
71+
public async Task DeleteListAsync(TodoList list)
9972
{
10073
await Init();
101-
string listId = list.ID.ToString();
74+
var listId = list.ID;
10275
// First delete all todo items in this list
10376
await _db.Execute("DELETE FROM todos WHERE list_id = ?", [listId]);
10477
await _db.Execute("DELETE FROM lists WHERE id = ?", [listId]);
105-
return 1;
10678
}
107-
108-
// Todo item operations
10979
public async Task<List<TodoItem>> GetItemsAsync(string listId)
11080
{
11181
await Init();
112-
var results = await _db.GetAll<TodoResult>(
82+
var results = await _db.GetAll<TodoItem>(
11383
"SELECT * FROM todos WHERE list_id = ? ORDER BY created_at DESC", [listId]);
11484

115-
return results.Select(r => new TodoItem
116-
{
117-
ID = r.id,
118-
ListId = r.list_id,
119-
Description = r.description,
120-
CreatedAt = r.created_at,
121-
CompletedAt = r.completed_at,
122-
CreatedBy = r.created_by,
123-
CompletedBy = r.completed_by,
124-
Completed = r.completed == 1
125-
}).ToList();
126-
}
127-
128-
public async Task<List<TodoItem>> GetItemsNotDoneAsync(string listId)
129-
{
130-
await Init();
131-
var results = await _db.GetAll<TodoResult>(
132-
"SELECT * FROM todos WHERE list_id = ? AND completed = 0 ORDER BY created_at DESC",
133-
[listId]);
134-
135-
return results.Select(r => new TodoItem
136-
{
137-
ID = r.id,
138-
ListId = r.list_id,
139-
Description = r.description,
140-
CreatedAt = r.created_at,
141-
CompletedAt = r.completed_at,
142-
CreatedBy = r.created_by,
143-
CompletedBy = r.completed_by,
144-
Completed = r.completed == 1
145-
}).ToList();
146-
}
147-
148-
public async Task<TodoItem> GetItemAsync(string id)
149-
{
150-
await Init();
151-
var results = await _db.GetAll<TodoResult>("SELECT * FROM todos WHERE id = ?", [id.ToString()]);
152-
var todo = results.FirstOrDefault();
153-
if (todo == null) return null;
154-
155-
return new TodoItem
156-
{
157-
ID = todo.id,
158-
ListId = todo.list_id,
159-
Description = todo.description,
160-
CreatedAt = todo.created_at,
161-
CompletedAt = todo.completed_at,
162-
CreatedBy = todo.created_by,
163-
CompletedBy = todo.completed_by,
164-
Completed = todo.completed == 1
165-
};
85+
return results.ToList();
16686
}
16787

168-
public async Task<int> SaveItemAsync(TodoItem item)
88+
public async Task SaveItemAsync(TodoItem item)
16989
{
17090
await Init();
17191
if (item.ID != "")
@@ -174,32 +94,33 @@ await _db.Execute(
17494
@"UPDATE todos
17595
SET description = ?, completed = ?, completed_at = ?, completed_by = ?
17696
WHERE id = ?",
177-
[item.Description,
178-
item.Completed ? 1 : 0,
179-
item.CompletedAt,
180-
item.CompletedBy,
181-
item.ID.ToString()]);
182-
return 1;
97+
[
98+
item.Description,
99+
item.Completed ? 1 : 0,
100+
item.CompletedAt,
101+
UserId,
102+
item.ID
103+
]);
183104
}
184105
else
185106
{
186107
await _db.Execute(
187108
@"INSERT INTO todos
188109
(id, list_id, description, created_at, completed, created_by)
189110
VALUES (uuid(), ?, ?, ?, ?, ?)",
190-
[item.ListId,
191-
item.Description,
192-
item.CreatedAt,
193-
item.Completed ? 1 : 0,
194-
item.CreatedBy]);
195-
return 1;
111+
[
112+
item.ListId,
113+
item.Description,
114+
item.CreatedAt,
115+
item.Completed ? 1 : 0,
116+
UserId
117+
]);
196118
}
197119
}
198120

199-
public async Task<int> DeleteItemAsync(TodoItem item)
121+
public async Task DeleteItemAsync(TodoItem item)
200122
{
201123
await Init();
202-
await _db.Execute("DELETE FROM todos WHERE id = ?", [item.ID.ToString()]);
203-
return 1;
124+
await _db.Execute("DELETE FROM todos WHERE id = ?", [item.ID]);
204125
}
205126
}
Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
1-
using SQLite;
1+
using Newtonsoft.Json;
22

33
namespace TodoSQLite.Models;
44

55
public class TodoItem
66
{
7-
[PrimaryKey]
7+
[JsonProperty("id")]
88
public string ID { get; set; } = "";
9+
10+
[JsonProperty("list_id")]
911
public string ListId { get; set; }
12+
13+
[JsonProperty("created_at")]
1014
public string CreatedAt { get; set; } = DateTime.UtcNow.ToString("o");
15+
16+
[JsonProperty("completed_at")]
1117
public string CompletedAt { get; set; }
18+
19+
[JsonProperty("description")]
1220
public string Description { get; set; }
21+
22+
[JsonProperty("created_by")]
1323
public string CreatedBy { get; set; }
24+
25+
[JsonProperty("completed_by")]
1426
public string CompletedBy { get; set; }
27+
28+
[JsonProperty("completed")]
1529
public bool Completed { get; set; }
1630
}
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
1-
using SQLite;
1+
using Newtonsoft.Json;
22

33
namespace TodoSQLite.Models;
44

55
public class TodoList
66
{
7-
[PrimaryKey]
7+
[JsonProperty("id")]
88
public string ID { get; set; } = "";
9+
10+
[JsonProperty("created_at")]
911
public string CreatedAt { get; set; } = DateTime.UtcNow.ToString("o");
12+
13+
[JsonProperty("name")]
1014
public string Name { get; set; }
15+
16+
[JsonProperty("owner_id")]
1117
public string OwnerId { get; set; }
1218
}

demos/TodoSQLite/Views/TodoListPage.xaml.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ private async void OnAddClicked(object sender, EventArgs e)
3333
var todo = new TodoItem
3434
{
3535
Description = description,
36-
ListId = _list.ID.ToString(),
37-
CreatedBy = "user" // TODO: Replace with actual user ID
36+
ListId = _list.ID
3837
};
3938
await _database.SaveItemAsync(todo);
4039
TodoItemsCollection.ItemsSource = await _database.GetItemsAsync(_list.ID);
@@ -64,7 +63,6 @@ private async void OnCheckBoxChanged(object sender, CheckedChangedEventArgs e)
6463
{
6564
todo.Completed = e.Value;
6665
todo.CompletedAt = e.Value ? DateTime.UtcNow.ToString("o") : null;
67-
todo.CompletedBy = e.Value ? "user" : null; // TODO: Replace with actual user ID
6866
await _database.SaveItemAsync(todo);
6967
}
7068
}

0 commit comments

Comments
 (0)