All checks were successful
toastie-stuff/SupportChild/pipeline/head This commit looks good
195 lines
No EOL
7.1 KiB
C#
195 lines
No EOL
7.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using MySqlConnector;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Serialization;
|
|
using SupportChild.Interviews;
|
|
|
|
namespace SupportChild.Database;
|
|
|
|
public class Interviews
|
|
{
|
|
public static bool TryGetInterviewTemplateJSON(ulong categoryID, out string templateJSON)
|
|
{
|
|
using MySqlConnection c = Connection.GetConnection();
|
|
c.Open();
|
|
using MySqlCommand selection = new("SELECT * FROM interview_templates WHERE category_id=@category_id", c);
|
|
selection.Parameters.AddWithValue("@category_id", categoryID);
|
|
selection.Prepare();
|
|
MySqlDataReader results = selection.ExecuteReader();
|
|
|
|
if (!results.Read())
|
|
{
|
|
templateJSON = null;
|
|
return false;
|
|
}
|
|
|
|
templateJSON = results.GetString("template");
|
|
results.Close();
|
|
return true;
|
|
}
|
|
|
|
public static bool TryGetInterviewFromTemplate(ulong categoryID, ulong channelID, out Interview interview)
|
|
{
|
|
using MySqlConnection c = Connection.GetConnection();
|
|
c.Open();
|
|
using MySqlCommand selection = new("SELECT * FROM interview_templates WHERE category_id=@category_id", c);
|
|
selection.Parameters.AddWithValue("@category_id", categoryID);
|
|
selection.Prepare();
|
|
MySqlDataReader results = selection.ExecuteReader();
|
|
|
|
// Check if messages exist in the database
|
|
if (!results.Read())
|
|
{
|
|
interview = null;
|
|
return false;
|
|
}
|
|
|
|
string templateString = results.GetString("template");
|
|
results.Close();
|
|
|
|
try
|
|
{
|
|
Template template = JsonConvert.DeserializeObject<Template>(templateString, new JsonSerializerSettings
|
|
{
|
|
Error = delegate (object _, ErrorEventArgs args)
|
|
{
|
|
Logger.Error("Error occured when trying to read interview template '" + categoryID + "' from database: " + args.ErrorContext.Error.Message);
|
|
Logger.Debug("Detailed exception:", args.ErrorContext.Error);
|
|
args.ErrorContext.Handled = false;
|
|
}
|
|
});
|
|
interview = new Interview(channelID, template.interview, template.definitions);
|
|
return true;
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Logger.Warn("Unable to create interview object from the current template for category '" + categoryID + "' in the database.", e);
|
|
interview = null;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool SetInterviewTemplate(Template template)
|
|
{
|
|
try
|
|
{
|
|
string templateString = JsonConvert.SerializeObject(template, new JsonSerializerSettings
|
|
{
|
|
NullValueHandling = NullValueHandling.Ignore,
|
|
MissingMemberHandling = MissingMemberHandling.Error,
|
|
Formatting = Formatting.Indented,
|
|
ContractResolver = new InterviewStep.StripInternalPropertiesResolver()
|
|
});
|
|
|
|
string query;
|
|
if (TryGetInterviewTemplateJSON(template.categoryID, out _))
|
|
{
|
|
query = "UPDATE interview_templates SET template = @template WHERE category_id=@category_id";
|
|
}
|
|
else
|
|
{
|
|
query = "INSERT INTO interview_templates (category_id,template) VALUES (@category_id, @template)";
|
|
}
|
|
|
|
using MySqlConnection c = Connection.GetConnection();
|
|
c.Open();
|
|
using MySqlCommand cmd = new(query, c);
|
|
cmd.Parameters.AddWithValue("@category_id", template.categoryID);
|
|
cmd.Parameters.AddWithValue("@template", templateString);
|
|
cmd.Prepare();
|
|
return cmd.ExecuteNonQuery() > 0;
|
|
}
|
|
catch (MySqlException e)
|
|
{
|
|
Logger.Error("Could not set interview template in database.", e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool TryDeleteInterviewTemplate(ulong categoryID)
|
|
{
|
|
try
|
|
{
|
|
using MySqlConnection c = Connection.GetConnection();
|
|
c.Open();
|
|
using MySqlCommand deletion = new("DELETE FROM interview_templates WHERE category_id=@category_id", c);
|
|
deletion.Parameters.AddWithValue("@category_id", categoryID);
|
|
deletion.Prepare();
|
|
return deletion.ExecuteNonQuery() > 0;
|
|
}
|
|
catch (MySqlException)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool SaveInterview(Interview interview)
|
|
{
|
|
try
|
|
{
|
|
string query;
|
|
if (TryGetInterview(interview.channelID, out _))
|
|
{
|
|
query = "UPDATE interviews SET interview = @interview, definitions = @definitions WHERE channel_id = @channel_id";
|
|
}
|
|
else
|
|
{
|
|
query = "INSERT INTO interviews (channel_id,interview, definitions) VALUES (@channel_id, @interview, @definitions)";
|
|
}
|
|
|
|
using MySqlConnection c = Connection.GetConnection();
|
|
c.Open();
|
|
using MySqlCommand cmd = new(query, c);
|
|
cmd.Parameters.AddWithValue("@channel_id", interview.channelID);
|
|
cmd.Parameters.AddWithValue("@interview", JsonConvert.SerializeObject(interview.interviewRoot, Formatting.Indented));
|
|
cmd.Parameters.AddWithValue("@definitions", JsonConvert.SerializeObject(interview.definitions, Formatting.Indented));
|
|
cmd.Prepare();
|
|
return cmd.ExecuteNonQuery() > 0;
|
|
}
|
|
catch (MySqlException e)
|
|
{
|
|
Logger.Error("Could not save interview to database.", e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool TryGetInterview(ulong channelID, out Interview interview)
|
|
{
|
|
using MySqlConnection c = Connection.GetConnection();
|
|
c.Open();
|
|
using MySqlCommand selection = new("SELECT * FROM interviews WHERE channel_id=@channel_id", c);
|
|
selection.Parameters.AddWithValue("@channel_id", channelID);
|
|
selection.Prepare();
|
|
MySqlDataReader results = selection.ExecuteReader();
|
|
|
|
// Check if ticket exists in the database
|
|
if (!results.Read())
|
|
{
|
|
interview = null;
|
|
return false;
|
|
}
|
|
interview = new Interview(channelID,
|
|
JsonConvert.DeserializeObject<InterviewStep>(results.GetString("interview")),
|
|
JsonConvert.DeserializeObject<Dictionary<string, InterviewStep>>(results.GetString("definitions")));
|
|
results.Close();
|
|
return true;
|
|
}
|
|
|
|
public static bool TryDeleteInterview(ulong channelID)
|
|
{
|
|
try
|
|
{
|
|
using MySqlConnection c = Connection.GetConnection();
|
|
c.Open();
|
|
using MySqlCommand deletion = new("DELETE FROM interviews WHERE channel_id=@channel_id", c);
|
|
deletion.Parameters.AddWithValue("@channel_id", channelID);
|
|
deletion.Prepare();
|
|
return deletion.ExecuteNonQuery() > 0;
|
|
}
|
|
catch (MySqlException)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
} |