SupportChild/Database/Interviews.cs
Toastie 4cbcf0b65e
All checks were successful
toastie-stuff/SupportChild/pipeline/head This commit looks good
Refactored and split up the database class
2025-02-06 15:15:18 +13:00

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;
}
}
}