Refactor GQL code. Auto load and save active shops. Auto start monitors.

This commit is contained in:
Patrick Fic
2020-01-20 15:42:59 -08:00
parent bc5cb13113
commit fa75c58633
11 changed files with 166 additions and 68 deletions

View File

@@ -40,6 +40,12 @@
<setting name="AutoStartMonitors" serializeAs="String"> <setting name="AutoStartMonitors" serializeAs="String">
<value>False</value> <value>False</value>
</setting> </setting>
<setting name="LastSelectedShop" serializeAs="String">
<value />
</setting>
<setting name="AutoStartMonitor" serializeAs="String">
<value>True</value>
</setting>
</BodyshopUploader.Properties.Settings> </BodyshopUploader.Properties.Settings>
</userSettings> </userSettings>
</configuration> </configuration>

View File

@@ -114,6 +114,15 @@ namespace BodyshopUploader.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to Auto-start Monitors.
/// </summary>
public static string Label_AutoStartMonitor {
get {
return ResourceManager.GetString("Label_AutoStartMonitor", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to File Path. /// Looks up a localized string similar to File Path.
/// </summary> /// </summary>
@@ -168,6 +177,15 @@ namespace BodyshopUploader.Properties {
} }
} }
/// <summary>
/// Looks up a localized string similar to Error uploading job..
/// </summary>
public static string Msg_NewJobUploadError {
get {
return ResourceManager.GetString("Msg_NewJobUploadError", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Password. /// Looks up a localized string similar to Password.
/// </summary> /// </summary>

View File

@@ -135,6 +135,9 @@
<data name="Label_AddMonitoringPath" xml:space="preserve"> <data name="Label_AddMonitoringPath" xml:space="preserve">
<value>Add Path</value> <value>Add Path</value>
</data> </data>
<data name="Label_AutoStartMonitor" xml:space="preserve">
<value>Auto-start Monitors</value>
</data>
<data name="Label_FilePath" xml:space="preserve"> <data name="Label_FilePath" xml:space="preserve">
<value>File Path</value> <value>File Path</value>
</data> </data>
@@ -153,6 +156,9 @@
<data name="Msg_NewJobUploaded" xml:space="preserve"> <data name="Msg_NewJobUploaded" xml:space="preserve">
<value>New Job Uploaded</value> <value>New Job Uploaded</value>
</data> </data>
<data name="Msg_NewJobUploadError" xml:space="preserve">
<value>Error uploading job.</value>
</data>
<data name="Password" xml:space="preserve"> <data name="Password" xml:space="preserve">
<value>Password</value> <value>Password</value>
</data> </data>

View File

@@ -68,5 +68,29 @@ namespace BodyshopUploader.Properties {
this["AutoStartMonitors"] = value; this["AutoStartMonitors"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string LastSelectedShop {
get {
return ((string)(this["LastSelectedShop"]));
}
set {
this["LastSelectedShop"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool AutoStartMonitor {
get {
return ((bool)(this["AutoStartMonitor"]));
}
set {
this["AutoStartMonitor"] = value;
}
}
} }
} }

View File

@@ -14,5 +14,11 @@
<Setting Name="AutoStartMonitors" Type="System.Boolean" Scope="User"> <Setting Name="AutoStartMonitors" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value> <Value Profile="(Default)">False</Value>
</Setting> </Setting>
<Setting Name="LastSelectedShop" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="AutoStartMonitor" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
</Settings> </Settings>
</SettingsFile> </SettingsFile>

View File

@@ -1,4 +1,6 @@
using GraphQL.Client; using GraphQL.Client;
using GraphQL.Common.Request;
using GraphQL.Common.Response;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -9,11 +11,33 @@ namespace BodyshopUploader.Utils
{ {
public static class GraphQL public static class GraphQL
{ {
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
public static GraphQLClient CreateGQLClient() public static GraphQLClient CreateGQLClient()
{ {
var graphQLClient = new GraphQLClient("https://bodyshop-dev-db.herokuapp.com/v1/graphql"); var graphQLClient = new GraphQLClient("https://bodyshop-dev-db.herokuapp.com/v1/graphql");
graphQLClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + Utils.Auth.authlink.FirebaseToken); graphQLClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + Utils.Auth.authlink.FirebaseToken);
return graphQLClient; return graphQLClient;
} }
public static async Task<dynamic> ExecuteQuery(GraphQLRequest r)
{
using (var g = Utils.GraphQL.CreateGQLClient())
{
logger.Trace("Firing GQL Query: {0} {1}", r.Query.ToString(), r.Variables);
var graphQLResponse = await g.PostAsync(r);
if (graphQLResponse.Errors == null)
{
logger.Trace("GQL Response: {0}", graphQLResponse.Data);
return graphQLResponse.Data;
}
else
{
logger.Error("Error executing query.");
Array.ForEach(graphQLResponse.Errors, x => logger.Error(x.ToString()));
return null;
}
}
}
} }
} }

View File

@@ -83,15 +83,12 @@ namespace BodyshopUploader.Utils
} }
private static async Task UpsertQueueItem(DTO_QueueItem item) private static async Task UpsertQueueItem(DTO_QueueItem item)
{ {
//Save the job to the DB.
item.Job.shopid = "52b7357c-0edd-4c95-85c3-dfdbcdfad9ac"; item.Job.shopid = "52b7357c-0edd-4c95-85c3-dfdbcdfad9ac";
item.Job.est_number = "123"; item.Job.est_number = "123";
item.Job.vehicle.data.shopid = "52b7357c-0edd-4c95-85c3-dfdbcdfad9ac"; item.Job.vehicle.data.shopid = "52b7357c-0edd-4c95-85c3-dfdbcdfad9ac";
logger.Info("Should upsert the job graphqlly here. {0}", item.Job); logger.Info("Manually setting the shop id! {0}", item.Job);
var r = new GraphQLRequest var r = new GraphQLRequest
{ {
@@ -104,20 +101,25 @@ namespace BodyshopUploader.Utils
} }
}", }",
Variables = new Variables = new
{ {
jobInput = item.Job jobInput = item.Job
} }
}; };
using (var g = Utils.GraphQL.CreateGQLClient()) var d = await Utils.GraphQL.ExecuteQuery(r);
if(d!= null)
{ {
var graphQLResponse = await g.PostAsync(r); App.Current.Dispatcher.Invoke(() =>
if(graphQLResponse.Errors == null)
{ {
logger.Trace("Job posted succesfully."); Growler.AddNotification(new Notification()
} {
Title = Properties.Resources.Msg_NewJobUploadError,
Subtitle = item.Job?.owner?.first_name?.Value + " " + item.Job?.owner?.last_name?.Value,
Message = item.Job?.vehicle?.v_model_yr?.Value + " " + item.Job?.vehicle?.v_make_desc?.Value + " " + item.Job?.vehicle?.v_model_desc?.Value
});
});
} }
_jobs.Dequeue(); _jobs.Dequeue();
App.Current.Dispatcher.Invoke(() => App.Current.Dispatcher.Invoke(() =>

View File

@@ -79,9 +79,9 @@ namespace BodyshopUploader.ViewModels
if (_startFolderMonitorsCommand == null) if (_startFolderMonitorsCommand == null)
{ {
_startFolderMonitorsCommand = new RelayCommand( _startFolderMonitorsCommand = new RelayCommand(
p => MonitoringPaths.Count > 0, p => MonitoringPaths.Count > 0 && ActiveShop != null,
p => StartAllFolderMonitors() p => StartAllFolderMonitors()
); ) ;
} }
return _startFolderMonitorsCommand; return _startFolderMonitorsCommand;
} }
@@ -102,5 +102,24 @@ namespace BodyshopUploader.ViewModels
return _stopFolderMonitorsCommand; return _stopFolderMonitorsCommand;
} }
} }
private ICommand _quitCommand;
public ICommand QuitCommand
{
get
{
if (_quitCommand == null)
{
_quitCommand = new RelayCommand(
p => true,
p =>
{
Properties.Settings.Default.Save(); App.Current.Shutdown(0);
});
}
return _quitCommand;
}
}
} }
} }

View File

@@ -31,20 +31,18 @@ namespace BodyshopUploader.ViewModels
Growler = new GrowlNotification(this); Growler = new GrowlNotification(this);
Utils.JobProcessingQueue.SetGrowler(Growler); Utils.JobProcessingQueue.SetGrowler(Growler);
} }
private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{ {
((BackgroundWorker)sender).Dispose(); ((BackgroundWorker)sender).Dispose();
//Progress = 0; Progress = 0;
logger.Trace("BW Completed.");
} }
private void Bw_ProgressChanged(object sender, ProgressChangedEventArgs e) private void Bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{ {
Progress = e.ProgressPercentage; Progress = e.ProgressPercentage;
StartFolderMonitorsCommand.Execute(null);
} }
private void bw_InitVm(object sender, DoWorkEventArgs e) private void bw_InitVm(object sender, DoWorkEventArgs e)
@@ -65,7 +63,6 @@ namespace BodyshopUploader.ViewModels
//Cannot use await. //Cannot use await.
LoadBodyshopData().Wait(); ; LoadBodyshopData().Wait(); ;
_callingThread.ReportProgress(80); _callingThread.ReportProgress(80);
logger.Debug("VM Init Complete"); logger.Debug("VM Init Complete");
@@ -75,7 +72,10 @@ namespace BodyshopUploader.ViewModels
private void MonitoringPathsChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) private void MonitoringPathsChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{ {
logger.Warn("TODO: Change monitoring lifecycles for folder watchers."); IndeterminateLoading = true;
StopAllFolderMonitors();
StartAllFolderMonitors();
IndeterminateLoading = false;
} }
public void AddFolderMonitoringPath() public void AddFolderMonitoringPath()
@@ -101,6 +101,7 @@ namespace BodyshopUploader.ViewModels
public void StartAllFolderMonitors() public void StartAllFolderMonitors()
{ {
IndeterminateLoading = true;
if (MonitoringPaths.Count > 0) if (MonitoringPaths.Count > 0)
foreach (var m in MonitoringPaths) foreach (var m in MonitoringPaths)
{ {
@@ -109,19 +110,20 @@ namespace BodyshopUploader.ViewModels
foreach (var p in MonitoringPaths) foreach (var p in MonitoringPaths)
{ {
//Ensure the directory exists, then start monitoring for CIECA files.
p.StartMonitor(); p.StartMonitor();
} }
IndeterminateLoading = false;
} }
public void StopAllFolderMonitors() public void StopAllFolderMonitors()
{ {
IndeterminateLoading = true;
if (MonitoringPaths.Count > 0) if (MonitoringPaths.Count > 0)
foreach (var m in MonitoringPaths) foreach (var m in MonitoringPaths)
{ {
m.StopMonitor(); m.StopMonitor();
} }
IndeterminateLoading = false;
} }
public async Task LoadBodyshopData() public async Task LoadBodyshopData()
@@ -140,33 +142,31 @@ namespace BodyshopUploader.ViewModels
}" }"
}; };
using (var g = Utils.GraphQL.CreateGQLClient()) var Data = await Utils.GraphQL.ExecuteQuery(r);
if (Data != null)
{ {
logger.Trace("Firing GQL Query: {0}", r.ToString()); ShopData = Data.bodyshops.ToObject<ObservableCollection<Bodyshop>>();
var graphQLResponse = await g.PostAsync(r); }
if (graphQLResponse.Errors == null) string SettingsSelectedShopUuid = Properties.Settings.Default.LastSelectedShop;
{ if (string.IsNullOrEmpty(SettingsSelectedShopUuid))
logger.Trace("GQL Response: {0}", graphQLResponse.Data.bodyshops); {
var p = graphQLResponse.Data.bodyshops; ActiveShop = ShopData[0] ?? null;
ShopData = graphQLResponse.Data.bodyshops.ToObject<ObservableCollection<Bodyshop>>(); Properties.Settings.Default.LastSelectedShop = ShopData[0].Id ?? null;
Properties.Settings.Default.Save();
} }
else else
{ {
logger.Error("Error querying bodyshop data."); ActiveShop = ShopData.Where(_ => _.Id == SettingsSelectedShopUuid).FirstOrDefault();
}
} }
} }
public async Task SetActiveBodyshop(Bodyshop b) public async Task SetActiveBodyshop()
{ {
IndeterminateLoading = true;
foreach (var s in ShopData) foreach (var s in ShopData)
{ {
if (s.Id == ActiveShop.Id) s.AssociationActive = true; if (s.Id == ActiveShop.Id) s.AssociationActive = true;
else s.AssociationActive = false; else s.AssociationActive = false;
var r = new GraphQLRequest var r = new GraphQLRequest
{ {
Query = @" Query = @"
@@ -185,21 +185,11 @@ namespace BodyshopUploader.ViewModels
assocActive = s.AssociationActive assocActive = s.AssociationActive
} }
}; };
await Utils.GraphQL.ExecuteQuery(r);
using (var g = Utils.GraphQL.CreateGQLClient())
{
logger.Trace("Firing GQL Query: {0}", r.ToString());
var graphQLResponse = await g.PostAsync(r);
if (graphQLResponse.Errors == null)
{
logger.Trace("GQL Response: {0}", graphQLResponse.Data);
}
else
{
logger.Error("Error mutating data.");
}
}
} }
Properties.Settings.Default.LastSelectedShop = ActiveShop.Id;
Properties.Settings.Default.Save();
IndeterminateLoading = false;
} }
public async Task TestGql() public async Task TestGql()
@@ -213,7 +203,6 @@ namespace BodyshopUploader.ViewModels
}; };
Growler.AddNotification(_n); Growler.AddNotification(_n);
var r = new GraphQLRequest var r = new GraphQLRequest
{ {
Query = @" Query = @"
@@ -224,12 +213,7 @@ namespace BodyshopUploader.ViewModels
} }
}" }"
}; };
await Utils.GraphQL.ExecuteQuery(r);
using (var g = Utils.GraphQL.CreateGQLClient())
{
var graphQLResponse = await g.PostAsync(r);
logger.Info("GQL Response: {0}", graphQLResponse.Data.bodyshops);
}
} }
} }
} }

View File

@@ -34,12 +34,18 @@ namespace BodyshopUploader.ViewModels
set { SetProperty(ref _progress, value); } set { SetProperty(ref _progress, value); }
} }
private bool _indeterminateLoading;
public bool IndeterminateLoading
{
get { return _indeterminateLoading; }
set { SetProperty(ref _indeterminateLoading, value); }
}
private Bodyshop _activeShop; private Bodyshop _activeShop;
public Bodyshop ActiveShop public Bodyshop ActiveShop
{ {
get { return _activeShop; } get { return _activeShop; }
set { SetProperty(ref _activeShop, value); SetActiveBodyshop(value); } set { SetProperty(ref _activeShop, value); Task.Run(async () => await SetActiveBodyshop()); }
} }
} }
} }

View File

@@ -29,6 +29,11 @@
<util:OpenMainWindowCommand x:Key="OpenMainWindowCommand" /> <util:OpenMainWindowCommand x:Key="OpenMainWindowCommand" />
</Window.Resources> </Window.Resources>
<DockPanel> <DockPanel>
<ProgressBar DockPanel.Dock="Bottom"
Value="{Binding Progress}"
IsIndeterminate="{Binding IndeterminateLoading}"
Height="10" />
<tb:TaskbarIcon DockPanel.Dock="Top" <tb:TaskbarIcon DockPanel.Dock="Top"
IconSource="../favicon.ico" IconSource="../favicon.ico"
DoubleClickCommand="{StaticResource OpenMainWindowCommand}" DoubleClickCommand="{StaticResource OpenMainWindowCommand}"
@@ -48,8 +53,7 @@
</tb:TaskbarIcon.TrayPopup> </tb:TaskbarIcon.TrayPopup>
<tb:TaskbarIcon.ContextMenu> <tb:TaskbarIcon.ContextMenu>
<ContextMenu> <ContextMenu>
<MenuItem Header="First Menu Item" /> <MenuItem Header="Exit" Command="{Binding QuitCommand}" />
<MenuItem Header="Second Menu Item" />
</ContextMenu> </ContextMenu>
</tb:TaskbarIcon.ContextMenu> </tb:TaskbarIcon.ContextMenu>
</tb:TaskbarIcon> </tb:TaskbarIcon>
@@ -76,17 +80,16 @@
</ItemsPanelTemplate> </ItemsPanelTemplate>
</ComboBox.ItemsPanel> </ComboBox.ItemsPanel>
</ComboBox> </ComboBox>
<Button Command="{Binding StartFolderMonitorsCommand}" <Button Command="{Binding StartFolderMonitorsCommand}"
Content="{x:Static p:Resources.Label_StartAllMonitors}" /> Content="{x:Static p:Resources.Label_StartAllMonitors}" />
<Button Command="{Binding StopFolderMonitorsCommand}" <Button Command="{Binding StopFolderMonitorsCommand}"
Content="{x:Static p:Resources.Label_StopAllMonitors}" /> Content="{x:Static p:Resources.Label_StopAllMonitors}" />
<CheckBox IsChecked="{Binding Source={x:Static p:Settings.Default}, Path=AutoStartMonitor}"
Content="{x:Static p:Resources.Label_AutoStartMonitor}"/>
</StackPanel> </StackPanel>
<ProgressBar DockPanel.Dock="Bottom"
Value="{Binding Progress}" />
<DataGrid ItemsSource="{Binding MonitoringPaths}" <DataGrid ItemsSource="{Binding MonitoringPaths}"
AutoGenerateColumns="False" AutoGenerateColumns="False"
CanUserAddRows="False"> CanUserAddRows="False">