443 lines
14 KiB
C#
443 lines
14 KiB
C#
using Microsoft.AspNetCore.SignalR.Client;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Specialized;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Net.Http;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using WD7UVN_HFT_2023241.Models;
|
|
|
|
namespace WD7UVN_SzTGUI_2023242.Client.WPF
|
|
{
|
|
public class RestService
|
|
{
|
|
HttpClient client;
|
|
|
|
public RestService(string baseurl, string pingableEndpoint = "swagger")
|
|
{
|
|
bool isOk = false;
|
|
do
|
|
{
|
|
isOk = Ping(baseurl + pingableEndpoint);
|
|
} while (isOk == false);
|
|
Init(baseurl);
|
|
}
|
|
|
|
private bool Ping(string url)
|
|
{
|
|
try
|
|
{
|
|
WebClient wc = new WebClient();
|
|
wc.DownloadData(url);
|
|
return true;
|
|
}
|
|
catch
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private void Init(string baseurl)
|
|
{
|
|
client = new HttpClient();
|
|
client.BaseAddress = new Uri(baseurl);
|
|
client.DefaultRequestHeaders.Accept.Clear();
|
|
client.DefaultRequestHeaders.Accept.Add(
|
|
new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue
|
|
("application/json"));
|
|
try
|
|
{
|
|
client.GetAsync("").GetAwaiter().GetResult();
|
|
}
|
|
catch (HttpRequestException)
|
|
{
|
|
throw new ArgumentException("Endpoint is not available!");
|
|
}
|
|
|
|
}
|
|
|
|
public async Task<List<T>> GetAsync<T>(string endpoint)
|
|
{
|
|
List<T> items = new List<T>();
|
|
HttpResponseMessage response = await client.GetAsync(endpoint);
|
|
if (response.IsSuccessStatusCode)
|
|
{
|
|
items = await response.Content.ReadAsAsync<List<T>>();
|
|
}
|
|
else
|
|
{
|
|
var error = await response.Content.ReadAsAsync<RestExceptionInfo>();
|
|
throw new ArgumentException(error.Msg);
|
|
}
|
|
return items;
|
|
}
|
|
|
|
public List<T> Get<T>(string endpoint)
|
|
{
|
|
List<T> items = new List<T>();
|
|
HttpResponseMessage response = client.GetAsync(endpoint).GetAwaiter().GetResult();
|
|
if (response.IsSuccessStatusCode)
|
|
{
|
|
items = response.Content.ReadAsAsync<List<T>>().GetAwaiter().GetResult();
|
|
}
|
|
else
|
|
{
|
|
var error = response.Content.ReadAsAsync<RestExceptionInfo>().GetAwaiter().GetResult();
|
|
throw new ArgumentException(error.Msg);
|
|
}
|
|
return items;
|
|
}
|
|
|
|
public async Task<T> GetSingleAsync<T>(string endpoint)
|
|
{
|
|
T item = default(T);
|
|
HttpResponseMessage response = await client.GetAsync(endpoint);
|
|
if (response.IsSuccessStatusCode)
|
|
{
|
|
item = await response.Content.ReadAsAsync<T>();
|
|
}
|
|
else
|
|
{
|
|
var error = await response.Content.ReadAsAsync<RestExceptionInfo>();
|
|
throw new ArgumentException(error.Msg);
|
|
}
|
|
return item;
|
|
}
|
|
|
|
public T GetSingle<T>(string endpoint)
|
|
{
|
|
T item = default(T);
|
|
HttpResponseMessage response = client.GetAsync(endpoint).GetAwaiter().GetResult();
|
|
if (response.IsSuccessStatusCode)
|
|
{
|
|
item = response.Content.ReadAsAsync<T>().GetAwaiter().GetResult();
|
|
}
|
|
else
|
|
{
|
|
var error = response.Content.ReadAsAsync<RestExceptionInfo>().GetAwaiter().GetResult();
|
|
throw new ArgumentException(error.Msg);
|
|
}
|
|
return item;
|
|
}
|
|
|
|
public async Task<T> GetAsync<T>(int id, string endpoint)
|
|
{
|
|
T item = default(T);
|
|
HttpResponseMessage response = await client.GetAsync(endpoint + "/" + id.ToString());
|
|
if (response.IsSuccessStatusCode)
|
|
{
|
|
item = await response.Content.ReadAsAsync<T>();
|
|
}
|
|
else
|
|
{
|
|
var error = await response.Content.ReadAsAsync<RestExceptionInfo>();
|
|
throw new ArgumentException(error.Msg);
|
|
}
|
|
return item;
|
|
}
|
|
|
|
public T Get<T>(int id, string endpoint)
|
|
{
|
|
T item = default(T);
|
|
HttpResponseMessage response = client.GetAsync(endpoint + "/" + id.ToString()).GetAwaiter().GetResult();
|
|
if (response.IsSuccessStatusCode)
|
|
{
|
|
item = response.Content.ReadAsAsync<T>().GetAwaiter().GetResult();
|
|
}
|
|
else
|
|
{
|
|
var error = response.Content.ReadAsAsync<RestExceptionInfo>().GetAwaiter().GetResult();
|
|
throw new ArgumentException(error.Msg);
|
|
}
|
|
return item;
|
|
}
|
|
|
|
public async Task PostAsync<T>(T item, string endpoint)
|
|
{
|
|
HttpResponseMessage response =
|
|
await client.PostAsJsonAsync("api/" + endpoint, item);
|
|
|
|
if (!response.IsSuccessStatusCode)
|
|
{
|
|
var error = await response.Content.ReadAsAsync<RestExceptionInfo>();
|
|
throw new ArgumentException(error.Msg);
|
|
}
|
|
response.EnsureSuccessStatusCode();
|
|
}
|
|
|
|
public void Post<T>(T item, string endpoint)
|
|
{
|
|
HttpResponseMessage response =
|
|
client.PostAsJsonAsync(endpoint, item).GetAwaiter().GetResult();
|
|
|
|
if (!response.IsSuccessStatusCode)
|
|
{
|
|
var error = response.Content.ReadAsAsync<RestExceptionInfo>().GetAwaiter().GetResult();
|
|
throw new ArgumentException(error.Msg);
|
|
}
|
|
response.EnsureSuccessStatusCode();
|
|
}
|
|
|
|
public async Task DeleteAsync(int id, string endpoint)
|
|
{
|
|
HttpResponseMessage response =
|
|
await client.DeleteAsync("api/" + endpoint + "/" + id.ToString());
|
|
|
|
if (!response.IsSuccessStatusCode)
|
|
{
|
|
var error = await response.Content.ReadAsAsync<RestExceptionInfo>();
|
|
throw new ArgumentException(error.Msg);
|
|
}
|
|
|
|
response.EnsureSuccessStatusCode();
|
|
}
|
|
|
|
public void Delete(int id, string endpoint)
|
|
{
|
|
HttpResponseMessage response =
|
|
client.DeleteAsync(endpoint + "/" + id.ToString()).GetAwaiter().GetResult();
|
|
|
|
if (!response.IsSuccessStatusCode)
|
|
{
|
|
var error = response.Content.ReadAsAsync<RestExceptionInfo>().GetAwaiter().GetResult();
|
|
throw new ArgumentException(error.Msg);
|
|
}
|
|
|
|
response.EnsureSuccessStatusCode();
|
|
}
|
|
|
|
public async Task PutAsync<T>(T item, string endpoint)
|
|
{
|
|
HttpResponseMessage response =
|
|
await client.PutAsJsonAsync("api/" + endpoint, item);
|
|
|
|
if (!response.IsSuccessStatusCode)
|
|
{
|
|
var error = await response.Content.ReadAsAsync<RestExceptionInfo>();
|
|
throw new ArgumentException(error.Msg);
|
|
}
|
|
|
|
response.EnsureSuccessStatusCode();
|
|
}
|
|
|
|
public void Put<T>(T item, string endpoint)
|
|
{
|
|
HttpResponseMessage response =
|
|
client.PutAsJsonAsync(endpoint, item).GetAwaiter().GetResult();
|
|
|
|
if (!response.IsSuccessStatusCode)
|
|
{
|
|
var error = response.Content.ReadAsAsync<RestExceptionInfo>().GetAwaiter().GetResult();
|
|
throw new ArgumentException(error.Msg);
|
|
}
|
|
|
|
response.EnsureSuccessStatusCode();
|
|
}
|
|
|
|
}
|
|
public class RestExceptionInfo
|
|
{
|
|
public RestExceptionInfo()
|
|
{
|
|
|
|
}
|
|
public string Msg { get; set; }
|
|
}
|
|
class NotifyService
|
|
{
|
|
private HubConnection conn;
|
|
|
|
public NotifyService(string url)
|
|
{
|
|
conn = new HubConnectionBuilder()
|
|
.WithUrl(url)
|
|
.Build();
|
|
|
|
conn.Closed += async (error) =>
|
|
{
|
|
await Task.Delay(new Random().Next(0, 5) * 1000);
|
|
await conn.StartAsync();
|
|
};
|
|
}
|
|
|
|
public void AddHandler<T>(string methodname, Action<T> value)
|
|
{
|
|
conn.On<T>(methodname, value);
|
|
}
|
|
|
|
public async void Init()
|
|
{
|
|
await conn.StartAsync();
|
|
}
|
|
|
|
}
|
|
|
|
public class RestCollection<T> : INotifyCollectionChanged, IEnumerable<T>
|
|
{
|
|
public event NotifyCollectionChangedEventHandler? CollectionChanged;
|
|
|
|
NotifyService notify;
|
|
RestService rest;
|
|
List<T> items;
|
|
bool hasSignalR;
|
|
Type type = typeof(T);
|
|
|
|
public RestCollection(string baseurl, string endpoint, string hub = null, bool nonCrud = false)
|
|
{
|
|
hasSignalR = hub != null;
|
|
this.rest = new RestService(baseurl, endpoint);
|
|
if (hub != null)
|
|
{
|
|
this.notify = new NotifyService(baseurl + hub);
|
|
this.notify.AddHandler<T>(type.Name + "Created", (T item) =>
|
|
{
|
|
items.Add(item);
|
|
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
|
|
});
|
|
this.notify.AddHandler<T>(type.Name + "Deleted", (T item) =>
|
|
{
|
|
var element = items.FirstOrDefault(t => t.Equals(item));
|
|
if (element != null)
|
|
{
|
|
items.Remove(item);
|
|
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
|
|
}
|
|
else
|
|
{
|
|
Init();
|
|
}
|
|
|
|
});
|
|
this.notify.AddHandler<T>(type.Name + "Updated", (T item) =>
|
|
{
|
|
Init();
|
|
});
|
|
|
|
this.notify.Init();
|
|
}
|
|
|
|
if (!nonCrud)
|
|
{
|
|
Init();
|
|
}
|
|
else
|
|
{
|
|
InitCustomEndpoint(endpoint);
|
|
}
|
|
}
|
|
|
|
private async Task InitCustomEndpoint(string endpoint)
|
|
{
|
|
items = await rest.GetAsync<T>(endpoint);
|
|
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
|
|
}
|
|
|
|
private async Task Init()
|
|
{
|
|
items = await rest.GetAsync<T>("api/" + typeof(T).Name);
|
|
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
|
|
}
|
|
|
|
public IEnumerator<T> GetEnumerator()
|
|
{
|
|
if (items != null)
|
|
{
|
|
return items.GetEnumerator();
|
|
}
|
|
else return new List<T>().GetEnumerator();
|
|
}
|
|
|
|
public List<T> GetItems()
|
|
{
|
|
if (items != null)
|
|
{
|
|
return items;
|
|
}
|
|
else return new List<T>();
|
|
}
|
|
|
|
IEnumerator IEnumerable.GetEnumerator()
|
|
{
|
|
if (items != null)
|
|
{
|
|
return items.GetEnumerator();
|
|
}
|
|
else return new List<T>().GetEnumerator();
|
|
}
|
|
|
|
public void Add(T item)
|
|
{
|
|
if (hasSignalR)
|
|
{
|
|
this.rest.PutAsync(item, typeof(T).Name);
|
|
}
|
|
else
|
|
{
|
|
this.rest.PutAsync(item, typeof(T).Name).ContinueWith((t) =>
|
|
{
|
|
Init().ContinueWith(z =>
|
|
{
|
|
Application.Current.Dispatcher.Invoke(() =>
|
|
{
|
|
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
public void Update(T item)
|
|
{
|
|
if (hasSignalR)
|
|
{
|
|
this.rest.PostAsync(item, typeof(T).Name);
|
|
}
|
|
else
|
|
{
|
|
this.rest.PostAsync(item, typeof(T).Name).ContinueWith((t) =>
|
|
{
|
|
Init().ContinueWith(z =>
|
|
{
|
|
Application.Current.Dispatcher.Invoke(() =>
|
|
{
|
|
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
|
|
});
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
public void Delete(int id)
|
|
{
|
|
if (hasSignalR)
|
|
{
|
|
this.rest.DeleteAsync(id, typeof(T).Name);
|
|
}
|
|
else
|
|
{
|
|
this.rest.DeleteAsync(id, typeof(T).Name).ContinueWith((t) =>
|
|
{
|
|
Init().ContinueWith(z =>
|
|
{
|
|
Application.Current.Dispatcher.Invoke(() =>
|
|
{
|
|
CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
public async Task<List<Employee>> GetSubordinates(Employee e)
|
|
{
|
|
List<Employee> res = new List<Employee>();
|
|
res = await this.rest.GetAsync<Employee>("api/GetSubordinates");
|
|
return res;
|
|
}
|
|
}
|
|
} |