aboutsummaryrefslogtreecommitdiff
path: root/cmnext-cli/src/Model/Channels/ChannelStore.cs
diff options
context:
space:
mode:
Diffstat (limited to 'cmnext-cli/src/Model/Channels/ChannelStore.cs')
-rw-r--r--cmnext-cli/src/Model/Channels/ChannelStore.cs95
1 files changed, 95 insertions, 0 deletions
diff --git a/cmnext-cli/src/Model/Channels/ChannelStore.cs b/cmnext-cli/src/Model/Channels/ChannelStore.cs
new file mode 100644
index 0000000..5d930fa
--- /dev/null
+++ b/cmnext-cli/src/Model/Channels/ChannelStore.cs
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 2024 Vaughn Nugent
+*
+* Package: CMNext.Cli
+* File: Program.cs
+*
+* CMNext.Cli is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published
+* by the Free Software Foundation, either version 2 of the License,
+* or (at your option) any later version.
+*
+* CMNext.Cli is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with CMNext.Cli. If not, see http://www.gnu.org/licenses/.
+*/
+
+using System.Threading;
+using System.Threading.Tasks;
+using System.Text.Json.Serialization;
+
+using CMNext.Cli.Site;
+
+using VNLib.Net.Rest.Client.Construction;
+using System.Linq;
+
+
+namespace CMNext.Cli.Model.Channels
+{
+ public sealed class ChannelStore(SiteManager site) : ICMNextStore<ChannelMeta>
+ {
+
+ ///<inheritdoc/>
+ public async Task CreateAsync(ChannelMeta entity, CancellationToken cancellation)
+ {
+ CMNextSiteAdapter cmSite = await site.GetAdapterAsync();
+
+ await cmSite.BeginRequest(new CreateChannelRequest(entity))
+ .ExecAsync(cancellation);
+ }
+
+ ///<inheritdoc/>
+ public async Task<ChannelMeta?> GetAsync(string id, CancellationToken cancellation)
+ {
+ ChannelMeta[] all = await ListAsync(cancellation);
+ return all.FirstOrDefault(c => c.Id == id);
+ }
+
+ ///<inheritdoc/>
+ public async Task<ChannelMeta[]> ListAsync(CancellationToken cancellation)
+ {
+ CMNextSiteAdapter cmSite = await site.GetAdapterAsync();
+
+ ChannelMeta[]? index = await cmSite
+ .BeginRequest(new ListChannelRequest())
+ .ExecAsync(cancellation)
+ .AsJson<ChannelMeta[]>();
+
+ return index ?? [];
+ }
+
+ ///<inheritdoc/>
+ public async Task DeleteAsync(string id, CancellationToken cancellation)
+ {
+ CMNextSiteAdapter cmSite = await site.GetAdapterAsync();
+
+ await cmSite.BeginRequest(new DeleteChannelRequest(id))
+ .ExecAsync(cancellation);
+ }
+
+ ///<inheritdoc/>
+ public async Task UpdateAsync(ChannelMeta entity, CancellationToken cancellation)
+ {
+ CMNextSiteAdapter cmSite = await site.GetAdapterAsync();
+
+ await cmSite.BeginRequest(new SetChannelRequest(entity))
+ .ExecAsync(cancellation);
+ }
+
+ private sealed class ChannelIndex : ICMNextIndex<ChannelMeta>
+ {
+ [JsonPropertyName("date")]
+ public long Date { get; set; }
+
+ [JsonPropertyName("records")]
+ public ChannelMeta[] Records { get; set; } = [];
+
+ [JsonPropertyName("version")]
+ public string Version { get; set; } = "0.0.0";
+ }
+ }
+} \ No newline at end of file