using Npgsql; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using PhilExampleCrawler.DataBase.Models; using System.Data; namespace PhilExampleCrawler.DataBase { //TODO: Could be made static actually public class UserAccess { private readonly string _dbconn; public UserAccess(DBSettings dbSettings) { _dbconn = dbSettings.ToString(); } public async Task AddUserAsync(string authCode, string phone, bool optin_telegram) { DB_User? u = null; try { using var conn = new NpgsqlConnection(_dbconn); conn.Open(); var cmd = conn.CreateCommand(); cmd.CommandText = SQL_InsertUser(authCode, phone, optin_telegram); if (await cmd.ExecuteScalarAsync() is int userID) u = new DB_User(userID, authCode, phone, optin_telegram, null, DateTime.Now); conn.Close(); } catch (Exception ex) { Console.WriteLine(ex); //TODO: log } return u; } public async Task GetUserAsync(int userID) { DB_User? user = null; try { using var conn = new NpgsqlConnection(_dbconn); conn.Open(); var cmd = conn.CreateCommand(); cmd.CommandText = SQL_SelectUser(userID); using (var dr = await cmd.ExecuteReaderAsync()) while (await dr.ReadAsync()) user = ReadUser(dr); if (user != null) { cmd.CommandText = SQL_SELECT_CrawlSessions(user.ID); using var dr = await cmd.ExecuteReaderAsync(); while (await dr.ReadAsync()) user.CrawlSessions.Add(ReadCrawlSession(dr, user.ID)); } conn.Close(); } catch (Exception ex) { Console.WriteLine(ex); //TODO: log } return user; } public async Task> GetUsersAsync() { List users = new(); try { using var conn = new NpgsqlConnection(_dbconn); conn.Open(); var cmd = conn.CreateCommand(); cmd.CommandText = SQL_SELECT_Users(); using (var dr = await cmd.ExecuteReaderAsync()) while (await dr.ReadAsync()) users.Add(ReadUser(dr)); foreach (var user in users) { cmd.CommandText = SQL_SELECT_CrawlSessions(user.ID); using var dr = await cmd.ExecuteReaderAsync(); while (await dr.ReadAsync()) user.CrawlSessions.Add(ReadCrawlSession(dr, user.ID)); } conn.Close(); } catch (Exception ex) { Console.WriteLine(ex); //TODO: log } return users; } private static DB_User ReadUser(NpgsqlDataReader dr) => new(id: dr.GetInt32("id"), auth_code: dr.GetString("auth_code"), phone: dr.GetString("phone"), optin_telegram: dr.GetBoolean("optin_telegram"), has_telegram: dr.ReadNullableBoolean("has_telegram"), createDate: dr.GetDateTime("create_date")); private static DB_CrawlSession ReadCrawlSession(NpgsqlDataReader dr, int userID) => new(id: dr.GetInt32("id"), user_id: userID, keywords: dr.GetString("keywords"), location_text: dr.GetString("location_text"), category_id: dr.GetInt32("category_id"), radius_km: dr.GetInt32("radius_km"), minPrice: dr.GetInt32("min_price"), maxPrice: dr.GetInt32("max_price"), isPrivate: dr.GetBoolean("is_private"), isCommerial: dr.GetBoolean("is_commercial")); #region SQLQueries private static string SQL_InsertUser(string authCode, string phone, bool optin_telegram) => $"INSERT INTO " + "phEx_user(auth_code" + ",phone" + ",optin_telegram)" + " VALUES " + "(" + $"'{authCode}'" + $",'{phone}'" + $",{optin_telegram})" + " RETURNING id;"; private static string SQL_SelectUser(int userID) => $"SELECT " + "id," + "auth_code," + "phone," + "optin_telegram," + "has_telegram," + "create_date" + " FROM " + "phEx_user" + " WHERE " + $"id = {userID};"; private static string SQL_SELECT_Users() => "SELECT " + "id," + "auth_code," + "phone," + "optin_telegram," + "has_telegram," + "create_date" + " FROM " + "phEx_user;"; private static string SQL_SELECT_CrawlSessions(int userID) => "SELECT " + "id," + "keywords," + "location_text," + "category_id," + "radius_km," + "min_price," + "max_price," + "is_private," + "is_commercial" + " FROM " + "crawl_session" + " WHERE " + $"user_id = {userID};"; #endregion } }