using Lava.NET.Types.Enums;
using Lava.NET.Types.LavaAPI;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Net.Http;
using System.Net.Http.Json;
using System.Text.Json.Nodes;
namespace Lava.NET
{
///
/// Ограниченный класс, который используется как базовый для бизнес части и публичной части Lava API. Использование нежелательно!
///
/// Токен от Lava.ru
/// Тип вашего аккаунта
public class LavaAPI(string token, LavaType type)
{
internal readonly HttpClient _httpClient = new HttpClient()
{
BaseAddress = new("https://api.lava.ru/")
};
///
/// Отправка запроса на сервер
///
/// path метода
/// требуемый тип аккаунта
/// Метод для отправки запроса
/// string body
/// string от сервера
/// Несоответсвие типа аккаунта и требуемого типа
internal virtual async Task SendRequest(string path, LavaType? neededType, HttpMethod method, string? body = null)
{
if (neededType != LavaType.any && neededType != type) throw new Exceptions.TypeException("Your Lava.ru account type is not equals needed type");
_httpClient.DefaultRequestHeaders.Authorization = new("", token);
using (var message = new HttpRequestMessage(method, _httpClient.BaseAddress + path))
{
message.Content = body == null ? new StringContent(body.ToString()) : null;
var req = await _httpClient.SendAsync(message);
return await req.Content.ReadAsStringAsync();
}
}
///
/// Создание ссылки на оплату (Выставление счета)
///
/// Данные, передаваемые в запрос. Смотреть АПИ
/// Ответ от сервера или null
public virtual async Task CreatePaymentAsync(PaymentRequest data)
=> JsonConvert.DeserializeObject(await SendRequest("invoice/create", LavaType.any, HttpMethod.Post, data.ToString()));
///
/// Получение информации о выставленном счете, в т.ч. о том, оплачен ли счет
///
/// айди выставленного счета
/// Ответ от сервера или null
public virtual async Task GetPaymentInfoAsync(string id)
=> JsonConvert.DeserializeObject(await SendRequest("invoice/info", LavaType.any, HttpMethod.Post, id));
///
/// Установка webhook для получения информации о пополнениях, оплате выставленных счетов и т.д.
///
/// HTTPS url до вашего бекенда, куда должен приходить вебхук
///
public async Task SetWebhookUrl(string url)
=> await SendRequest("invoice/set-webhook", LavaType.any, HttpMethod.Post, url);
///
/// Проверка токена
///
///
public async Task pingAsync()
=> JsonNode.Parse(await SendRequest("test/ping", LavaType.any, HttpMethod.Get))?["status"]?.ToString().Equals(true) ?? false;
}
public sealed class PublicLavaAPI : LavaAPI
{
///
/// Для обычных юзеров, т.е. вкладка Кошелек
///
/// токен от вашего аккаунта
public PublicLavaAPI(string token) : base(token, LavaType.wallet) { }
///
/// Получение кошельков на вашем аккаунте
///
/// Список из кошельков или null
public async Task getWallets()
=> JsonConvert.DeserializeObject(await SendRequest("wallet/list", LavaType.wallet, HttpMethod.Get));
///
/// Cоздние заявки на вывод
///
/// данные, передаваемые в запрос
/// Стандартный ответ от сервера или null
public async Task MakeWithdraw(Withdraw withdraw)
=> JsonConvert.DeserializeObject(await SendRequest("withdraw/create", LavaType.wallet, HttpMethod.Post, withdraw.ToString()));
///
/// Информация о выводе
///
/// Id заявки
/// Информация о выводе
public async Task InfoWithdrawAsync(string id)
=> JsonConvert.DeserializeObject(await SendRequest("withdraw/info", LavaType.wallet, HttpMethod.Post, id));
///
/// Создание перевода
///
/// Данные, передаваемые в запрос
/// Стандартный ответ от сервера или null
public async Task MakeTransfer(Transfer data)
=> JsonConvert.DeserializeObject(await SendRequest("transfer/create", LavaType.wallet, HttpMethod.Post, data.ToString()));
///
/// Получение информации о переводе
///
/// Id перевода
/// Данные о переводе
public async Task GetTransferDataAsync(string id)
=> JsonConvert.DeserializeObject(await SendRequest("transfer/info", LavaType.wallet, HttpMethod.Post, id));
///
/// Получение всех транзакций
///
/// Необ. данные для настройки вывода
/// Все транзакции
public async Task GetTransactionsAsync(TransactionParam? transaction = null)
=> JsonConvert.DeserializeObject(await SendRequest("transactions/list", LavaType.wallet, HttpMethod.Post, transaction?.ToString()));
///
/// Получение банков, подключенных к СБП
///
/// Список банков
public async Task GetSBPBanksAsync()
=> JsonConvert.DeserializeObject(await SendRequest("withdraw/get-sbp-bank-list", LavaType.wallet, HttpMethod.Post));
}
///
/// В РАЗРАБОТКЕ
/// Часть lava.ru API, которая работает с бизнесом. Вкладка "Бизнес" dev.lava.ru
///
/// Токен вашего аккаунта
public sealed class BusinessLavaAPI(string token) : LavaAPI(token, LavaType.business)
{
internal async Task SendRequest(string path, LavaType? neededType = LavaType.business, HttpMethod? method = null, string? body = null, bool isSpecial = true)
{
method ??= HttpMethod.Post;
if (neededType != LavaType.any && neededType != LavaType.business) throw new Exceptions.TypeException("Your Lava.ru account type is not equals needed type");
_httpClient.DefaultRequestHeaders.Authorization = new("", token);
if (isSpecial)
{
_httpClient.DefaultRequestHeaders.Accept.Add(new("application/json"));
_httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json");
}
using (var message = new HttpRequestMessage(method, path))
{
message.Content = body == null ? new StringContent(body.ToString()) : null;
var req = await _httpClient.SendAsync(message);
return await req.Content.ReadAsStringAsync();
}
}
///
/// Создание вывода
///
/// Данные, передаваемые в запрос
///
public async Task CreatePayoffAsync(PayoffRequest request)
=> JsonConvert.DeserializeObject(await SendRequest("business/payoff/create", body: request.ToString()));
public async Task GetPayoffDataAsync(PayoffDataRequest request)
=> JsonConvert.DeserializeObject(await SendRequest("business/payoff/info", body: request.ToString()));
public async Task GetPayoffTariffAsync(PayoffTariffRequest request)
=> JsonConvert.DeserializeObject(await SendRequest("business/payoff/get-tariffs", body: request.ToString()));
public async Task CheckPayoffTariffAsync(PayoffCheckoutRequest request)
=> JsonConvert.DeserializeObject(await SendRequest("business/payoff/check-wallet", body: request.ToString()));
// В разработке...
}
}