1
0
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

183 lines
8.0 KiB

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<DB_User?> 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<DB_User?> 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<List<DB_User>> GetUsersAsync()
{
List<DB_User> 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
}
}