Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
a970e5a
fix(#173): use Id ?? RowKey for checking and opening offline post HTM…
fboucher-os Aug 8, 2026
a5d25a2
feat(#176): add sync progress bar and status updates for downloading …
fboucher-os Aug 8, 2026
2c97bd1
should have done that long ago
fboucher-os Aug 11, 2026
2677eb1
fix: resolve Android MAUI app crash when opening URLs (issue #177) (#…
fboucher-os Aug 13, 2026
1acc7d6
feat: add up/down reordering for categories and notes in summary edit…
fboucher-os Aug 15, 2026
007a4d4
feat: add text size slider and fix text wrapping on offline reader pa…
fboucher-os Aug 15, 2026
5077f44
bumb version
fboucher-os Aug 15, 2026
ff8ecd1
feat: implement async background post content extraction to save HTML…
fboucher Aug 15, 2026
aaa3880
feat: improve sync html download, always display read post button, an…
fboucher-os Aug 15, 2026
369139c
feat: configure protected Azure Function Parser API and key propagati…
fboucher Aug 15, 2026
5a65b09
Merge branch 'main' into feature/resolve-pr-188-conflicts
fboucher-os Aug 15, 2026
c8afa57
update missing env variable
fboucher-os Aug 16, 2026
7726e97
fix
fboucher-os Aug 16, 2026
6018801
chore: bump version to 1.4.1
fboucher-os Aug 16, 2026
1b28a01
Merge branch 'main' into v-next
fboucher Aug 16, 2026
be83109
fix(#190): update actions/cache to v5 for Node.js 24 compatibility in…
fboucher-os Sep 5, 2026
ae568c8
Update version to 1.4.2, add sync progress tracking, and reader page …
fboucher-os Sep 5, 2026
322848d
ci: include version in android apk filename (#193)
fboucher Sep 5, 2026
6c944fa
Merge branch 'main' into v-next
fboucher Sep 5, 2026
305d527
Fix document sync stuck and improve sync progress and offline fallbac…
fboucher-os Sep 19, 2026
d51dd46
fix: constrain reader text size slider and add step buttons (fixes #1…
fboucher-os Sep 19, 2026
239cbc9
feat: Add markdown saving for reading notes and bump version to 1.4.3
fboucher-os Sep 19, 2026
47f9e59
feat: add MAUI storage tab (#200)
fboucher-os Sep 19, 2026
9d76219
chore: bump application version to 1.4.3 (#201)
fboucher-os Sep 19, 2026
bce656e
Merge branch 'main' into v-next
fboucher Sep 19, 2026
34548d0
fix(ci): fix timeout and rate limit failures in OpenCode Daily Triage…
fboucher-os Sep 20, 2026
39e20c8
feat(ui): add dedicated quickadd popup and MinimalLayout for bookmark…
fboucher-os Sep 20, 2026
73a2d76
Speed up MAUI app sync (#208) (#209)
fboucher Sep 30, 2026
a00be97
chore: bump application version to 1.4.4
fboucher-os Sep 30, 2026
98441ef
Merge branch 'main' into v-next
fboucher-os Sep 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>1.4.3</Version>
<Version>1.4.4</Version>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
Expand Down
39 changes: 39 additions & 0 deletions src/NoteBookmark.Api.Tests/Endpoints/DeltaApiTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,45 @@ private async Task<Post> CreateAndSaveTestPost(string rowKey)
return post;
}

// ── Post ids ─────────────────────────────────────────────────────────────

[Fact]
public async Task GetPostIds_ReturnsIdsOfReadAndUnreadPosts()
{
// Arrange
var unreadPost = CreateTestPost("ids-unread-post-1");
var readPost = CreateTestPost("ids-read-post-1");
readPost.is_read = true;
await _client.PostAsJsonAsync("/api/posts/", unreadPost);
await _client.PostAsJsonAsync("/api/posts/", readPost);

// Act
var response = await _client.GetAsync("/api/posts/ids");

// Assert
response.StatusCode.Should().Be(HttpStatusCode.OK);
var ids = await response.Content.ReadFromJsonAsync<List<string>>();
ids.Should().NotBeNull();
ids.Should().Contain(unreadPost.RowKey);
ids.Should().Contain(readPost.RowKey);
}

[Fact]
public async Task GetPostIds_DoesNotReturnDeletedPosts()
{
// Arrange
var post = CreateTestPost("ids-deleted-post-1");
await _client.PostAsJsonAsync("/api/posts/", post);
await _client.DeleteAsync($"/api/posts/{post.RowKey}");

// Act
var ids = await _client.GetFromJsonAsync<List<string>>("/api/posts/ids");

// Assert
ids.Should().NotBeNull();
ids.Should().NotContain(post.RowKey);
}

private static Post CreateTestPost(string rowKey)
{
return new Post
Expand Down
10 changes: 10 additions & 0 deletions src/NoteBookmark.Api/DataStorageService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,16 @@ orderby post.Timestamp
return lstPosts;
}

public List<string> GetPostIds()
{
var tblPosts = GetPostTable();
// Only project the key columns so the query stays small even with thousands of posts.
// Clients identify posts by Id, falling back to RowKey, so return the same value.
return tblPosts.Query<Post>(select: new[] { "RowKey", "id", "Id" })
.Select(p => p.Id ?? p.RowKey)
.ToList();
}

public Post? GetPost(string rowKey)
{
var tblPost = GetPostTable();
Expand Down
2 changes: 2 additions & 0 deletions src/NoteBookmark.Api/IDataStorageService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ namespace NoteBookmark.Api;
public interface IDataStorageService
{
public List<PostL> GetFilteredPosts(string filter);

public List<string> GetPostIds();

public Post? GetPost(string rowKey);

Expand Down
8 changes: 8 additions & 0 deletions src/NoteBookmark.Api/PostEndpoints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ public static void MapPostEndpoints(this IEndpointRouteBuilder app)
.WithDescription("Get all unread posts");
endpoints.MapGet("/read", GetReadPosts)
.WithDescription("Get all read posts");
endpoints.MapGet("/ids", GetPostIds)
.WithDescription("Get the ids of all existing posts (read and unread)");
endpoints.MapGet("/{id}", Get)
.WithDescription("Get a post by id");
endpoints.MapGet("/{postId}/html", GetPostHtml)
Expand Down Expand Up @@ -57,6 +59,12 @@ static List<PostL> GetReadPosts(TableServiceClient tblClient, BlobServiceClient
return posts;
}

static List<string> GetPostIds(TableServiceClient tblClient, BlobServiceClient blobClient)
{
var dataStorageService = new DataStorageService(tblClient, blobClient);
return dataStorageService.GetPostIds();
}

static async Task<Results<ContentHttpResult, NotFound<ErrorMessage>>> GetPostHtml(
string postId, BlobServiceClient blobClient)
{
Expand Down
Loading
Loading