using Newtonsoft.Json; using System.Globalization; using System.IO; using System.Net.WebSockets; using System.Text; using System.Text.Json.Serialization; namespace CodeEditorApi.Helpers { public static class SessionFiles { private static string sessionPath = "database/"; public static Session Create(Guid sessionId) { if (CheckForDirectoryExists(sessionId)) { throw new Exception("Session already exists"); } else { CreateDirectory(sessionId); } return GetSession(sessionPath + "/" + sessionId); } public static void Save(SessionData data) { if (!CheckForDirectoryExists(data.SessionId)) { CreateDirectory(data.SessionId); } WriteFile(data); } public static Session[] Get() { var dir = Directory.GetDirectories(sessionPath); var res = new List(); foreach (var folder in dir) { var files = Directory.GetFiles(folder); res.Add(GetSession(folder)); } return res.ToArray(); } public static SessionData[] Get(Guid sessionId) { var fileNames = Directory.GetFiles(sessionPath + "/" + sessionId); var res = new List(); foreach (var fileName in fileNames) { res.Add(GetSessionData(sessionId, fileName)); } return res.ToArray(); } private static bool CheckForDirectoryExists(Guid sessionId) { if (Directory.Exists(sessionPath + sessionId)) { return true; } else { return false; } } private static bool CreateDirectory(Guid sessionId) { Directory.CreateDirectory(sessionPath + sessionId); return true; } private static bool CreateFile(SessionData data) { if (!File.Exists(sessionPath + data.FileName)) { using (FileStream fs = File.Create(sessionPath + data.FileName)) { } } return true; } private static bool WriteFile(SessionData data) { CreateFile(data); using (StreamWriter sw = File.CreateText(sessionPath + data.FileName)) { sw.Write(data.Data); } return true; } private static DataType GetExtension(string fileName) { if (fileName.EndsWith(".js")) { return DataType.Javascript; } else if (fileName.EndsWith(".css")) { return DataType.CSS; } else if (fileName.EndsWith(".html")) { return DataType.HTML; } return DataType.Text; } private static Session GetSession(string path) { var files = Directory.GetFiles(path); var strId = path.Substring(path.LastIndexOf("/") + 1); var session = new Session { Id = Guid.Parse(strId), NumberOfChanges = files.Length, Timestamp = Directory.GetCreationTime(path) }; return session; } private static SessionData GetSessionData(Guid sessionId, string path) { SessionData sessionData; using (StreamReader sr = new StreamReader(path)) { var content = sr.ReadToEnd(); sessionData = new SessionData { SessionId = sessionId, Data = content, Type = GetExtension(path), Timestamp = DateTime.Now }; } return sessionData; } public static string GetFormattedDate(DateTime date) { return date.ToString("yyyy-MM-ddTHH-mm-ss-fff"); } public static DateTime GetDateFromFormat(string date) { CultureInfo provider = CultureInfo.InvariantCulture; return DateTime.ParseExact(date, "yyyy-MM-ddTHH-mm-ss-fff", provider); } } }