Merge branch 'master' of http://git.vdk2ch.ru:3000/RakVhalate/2chBackAPI
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Simple_Not 2023-06-20 12:21:05 +10:00
commit 2b1a229623
40 changed files with 1746 additions and 314 deletions

View File

@ -22,6 +22,7 @@ steps:
commands: commands:
- cd /usr/share/$DRONE_REPO_NAME - cd /usr/share/$DRONE_REPO_NAME
- dotnet build - dotnet build
- name: recreate dist folder - name: recreate dist folder
commands: commands:
- rm -rf /usr/share/$DRONE_REPO_NAME/dist - rm -rf /usr/share/$DRONE_REPO_NAME/dist

12
.idea/NeDvachAPI.iml Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/NeDvachAPI.iml" filepath="$PROJECT_DIR$/.idea/NeDvachAPI.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

45
.idea/workspace.xml Normal file
View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="afeb71ff-aaed-4a5b-8ece-55d4f78fc0c7" name="Changes" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="ProjectId" id="2HppPxAx0SVc4HMyQfWgDlfmGn2" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"WebServerToolWindowFactoryState": "false",
"vue.rearranger.settings.migration": "true"
}
}]]></component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="afeb71ff-aaed-4a5b-8ece-55d4f78fc0c7" name="Changes" comment="" />
<created>1668991859805</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1668991859805</updated>
<workItem from="1668991862249" duration="12000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
</project>

File diff suppressed because it is too large Load Diff

BIN
.vs/NeDvachAPI/v17/.wsuo Normal file

Binary file not shown.

View File

@ -1,8 +1,7 @@
{ {
"ExpandedNodes": [ "ExpandedNodes": [
"", ""
"\\Controllers"
], ],
"SelectedNode": "\\Program.cs", "SelectedNode": "\\appsettings.json",
"PreviewInSolutionExplorer": false "PreviewInSolutionExplorer": false
} }

Binary file not shown.

View File

@ -1,6 +1,5 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System.Data; using NeDvachAPI.DBControllers;
using System.Text.Json;
namespace NeDvachAPI.Controllers namespace NeDvachAPI.Controllers
{ {

View File

@ -0,0 +1,21 @@
using Microsoft.AspNetCore.Mvc;
using NeDvachAPI.BufferControllers;
using System.Text.Json;
using System.Web.Http;
using HttpGetAttribute = Microsoft.AspNetCore.Mvc.HttpGetAttribute;
using RouteAttribute = Microsoft.AspNetCore.Mvc.RouteAttribute;
namespace NeDvachAPI.Controllers
{
[ApiController]
[Route("[controller]")]
public class ListController : ControllerBase
{
[HttpGet(Name = "GetPosts")]
public string Get([FromUri] string board, int thread)
{
string postsJson = JsonSerializer.Serialize(APIThreadBuffer.GetThread(thread));
return postsJson ;
}
}
}

View File

@ -0,0 +1,50 @@
using Microsoft.AspNetCore.Mvc;
using NeDvachAPI.DBControllers;
namespace NeDvachAPI.Controllers
{
[ApiController]
[Route("[controller]")]
public class UploadPic : ControllerBase
{
[HttpPost(Name = "UploadPicture")]
public async Task<JsonResult> ReceivePost([FromForm] IFormFile PostPicture)
{
string receivedFileName = PostPicture.FileName;
string fName = Path.GetFileNameWithoutExtension(receivedFileName);
string fExtention = Path.GetExtension(receivedFileName);
string previevFileName = fName + 's' + fExtention;
Console.WriteLine("Расширение файла: " + fExtention);
if (ImageController.CheckExtention(fExtention)) //file type check
{
///Local Buffer File Part
string filePath;
string previevPath;
filePath = Directory.GetCurrentDirectory() + "\\Buffer\\" + receivedFileName;
previevPath = Directory.GetCurrentDirectory() + "\\Buffer\\" + previevFileName;
//creating original file buffer
Stream picBuffer = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
PostPicture.CopyTo(picBuffer);
picBuffer.Close();
//resizing
ImageController.ResizeImage(filePath, previevPath, 300, 400);
///MinIo part
await MinIOchat.PictureUpload(previevPath, receivedFileName, "thread-pics-small"); //upload thumbnail
JsonResult picAdress = new(await MinIOchat.PictureUpload(filePath, receivedFileName, "thread-pics")); //upload fullsize
Console.WriteLine("Загружен файл:" + "http://static.vdk2ch.ru:15555/thread-pics/" + receivedFileName);
return picAdress;
}
else return new JsonResult("Неверный тип файла");
}
}
}

View File

@ -0,0 +1,34 @@
using Microsoft.AspNetCore.Mvc;
using NeDvachAPI.BufferControllers;
using NeDvachAPI.DBControllers;
using NeDvachAPI.Models;
namespace NeDvachAPI.Controllers
{
[ApiController]
[Route("[controller]")]
public class PostToController : ControllerBase
{
[HttpPost(Name = "PostPosts")]
public JsonResult ReceivePost([FromBody] Post ReceivedPost)
{
string ipAddress = Request.HttpContext.Connection.RemoteIpAddress.ToString();
ReceivedPost.Ip = ipAddress;
if(ReceivedPost.Text.Length == 0)
{
return new JsonResult("Вы отправили пустое сообщение!");
}
try
{
DBchat.SendPost(ReceivedPost);
APIThreadBuffer.RefreshThread(ReceivedPost.Thread_Id);
return new JsonResult("Сообщение успешно добавлено.");
}
catch
{
return new JsonResult("Произошла ошибка постинга");
}
}
}
}

View File

@ -0,0 +1,21 @@
using Microsoft.AspNetCore.Mvc;
using NeDvachAPI.BufferControllers;
using System.Text.Json;
using System.Web.Http;
using HttpGetAttribute = Microsoft.AspNetCore.Mvc.HttpGetAttribute;
using RouteAttribute = Microsoft.AspNetCore.Mvc.RouteAttribute;
namespace NeDvachAPI.Controllers
{
[ApiController]
[Route("[controller]")]
public class ThreadsController : ControllerBase
{
[HttpGet(Name = "GetThreads")]
public string Get([FromUri] string board)
{
string postsJson = JsonSerializer.Serialize(APIThreadBuffer.GetThreadPreviews());
return postsJson;
}
}
}

24
AuthInfo.cs Normal file
View File

@ -0,0 +1,24 @@
namespace NeDvachAPI
{
public class AuthInfo
{
public class MinIo
{
public static string endpoint = "static.vdk2ch.ru:15555";
public static string bucketName = "thread-pics thread-pics-small";
public static string username = "admin";
public static string password = "password2ch";
}
public class DB
{
public static string Host = "postgres.vdk2ch.ru";
public static string User = "postgres";
public static string DBname = "dvaach";
public static string Password = "postgres";
public static string Port = "5432";
}
}
}

View File

@ -0,0 +1,82 @@
using NeDvachAPI.DBControllers;
using NeDvachAPI.Models;
namespace NeDvachAPI.BufferControllers
{
public class APIThreadBuffer
{
private static List<Post>[] ThreadsPrewievs = new List<Post>[0];
private static List<Post>[] Threads = new List<Post>[0];
public static void WriteThreadPreviewsBuffer(List<Post> OPPostsToWrite) //add list of OP-posts and last post to buffer
{
for(int pos = 0; pos < OPPostsToWrite.Count; pos ++)
{
var deb = new List<Post>();
deb.Add(OPPostsToWrite[pos]);
ThreadsPrewievs = ThreadsPrewievs.Append(deb).ToArray();
}
}
public static void AppendToThreadPreviews(int index,Post toAppend)
{
ThreadsPrewievs[index].Add(toAppend);
}
public static List<Post>[] GetThreadPreviews()
{
return ThreadsPrewievs;
}
public static void UpdateThreadsPreviews(int threadId)
{
Console.WriteLine("Пытаюсь обновить превью треда " + threadId);
var newPreview = new List<Post>();
newPreview.Add(ThreadsPrewievs[threadId -1][0]);
int targetLength = APIThreadBuffer.GetThreadLength(threadId - 1);
for (int lastofthree = targetLength- 2; lastofthree <= targetLength; lastofthree ++)
{
newPreview.Add(GetSinglePost(threadId - 1,lastofthree));
}
ThreadsPrewievs[threadId -1] = newPreview;
}
public static void AppendThreadsBuffer(List<Post> ThreadToAdd) //add thread's posts from DB to buffer
{
Threads = Threads.Append(ThreadToAdd).ToArray();
}
public static int GetThreadLength(int threadId)
{
return Threads[threadId].Count;
}
public static List<Post> GetThread(int threadId)
{
if (threadId < Threads.Length + 1 & threadId != 0)
{
return Threads[threadId - 1];
}
else return null;
}
public static Post GetSinglePost(int thread, int postPosition)
{
List<Post> postsList = Threads[thread];
return postsList[postPosition-1];
}
public static void UpdateThreadPosts(int threadId)
{
Console.WriteLine("Пытаюсь обновить тред " + threadId);
Threads[threadId - 1] = DBchat.PostsList("b", threadId);
}
public static void RefreshThread(int threadId)
{
UpdateThreadPosts(threadId);
UpdateThreadsPreviews(threadId);
}
}
}

View File

@ -0,0 +1,15 @@
using NeDvachAPI.Models;
using Npgsql;
namespace NeDvachAPI.DBControllers
{
public class BanList
{
public static string[] GetBanned()
{
string[] bannedIPs = new string[0];
//
return bannedIPs;
}
}
}

View File

@ -0,0 +1,33 @@
using NeDvachAPI.DBControllers;
using NeDvachAPI.Models;
namespace NeDvachAPI.BufferControllers
{
public class BufferFill
{
public static bool FillBuffer(string board) //method to get buffer of information, which is being ran while API is started
{
List<Post> Previews = DBchat.ThreadsList(board);
APIThreadBuffer.WriteThreadPreviewsBuffer(Previews);
Console.WriteLine("Adding OP-posts to buffer");
for (int threadId = 1; threadId <= Previews.Count; threadId++)
{
APIThreadBuffer.AppendThreadsBuffer(DBchat.PostsList(board, threadId));
}
Console.WriteLine($@"Buffering threads {1} to {Previews.Count}.");
for (int preview = 0; preview < Previews.Count; preview++)
{
int targetLength = APIThreadBuffer.GetThreadLength(preview);
for (int lastofthree = targetLength- 2; lastofthree <= targetLength; lastofthree ++)
{
APIThreadBuffer.AppendToThreadPreviews(preview,APIThreadBuffer.GetSinglePost(preview,lastofthree));
}
}
return true;
}
}
}

View File

@ -1,23 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using System.Text.Json;
namespace NeDvachAPI.Controllers
{
[ApiController]
[Route("[controller]")]
public class ListController : ControllerBase
{
[HttpGet(Name = "GetPosts")]
public string Get()
{
//Post[] posts = DBchat.DbList();
List<Post> posts = DBchat.DbList();
string postsJson = JsonSerializer.Serialize(posts);
Console.WriteLine("Запрошен список постов");
return postsJson ;
}
}
}

View File

@ -1,19 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using System.Net.Http.Headers;
using System.Text.Json;
namespace NeDvachAPI.Controllers
{
[ApiController]
[Route("[controller]")]
public class UploadPic : ControllerBase
{
[HttpPost(Name = "UploadPicture")]
public JsonResult ReceivePost([FromForm] IFormFile PostPicture)
{
Console.Write("Принята картинка ");
Console.WriteLine(PostPicture.FileName);
return new JsonResult(PostPicture.FileName + " получен!");
}
}
}

View File

@ -1,18 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using System.Text.Json;
namespace NeDvachAPI.Controllers
{
[ApiController]
[Route("[controller]")]
public class PostToController : ControllerBase
{
[HttpPost(Name = "PostPosts")]
public JsonResult ReceivePost([FromBody] Post ReceivedPost)
{
Console.WriteLine("Принят пост");
DBchat.SendPost(ReceivedPost);
return new JsonResult("Posted Successfully!");
}
}
}

View File

@ -1,19 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using System.Net;
using System.Text.Json;
namespace NeDvachAPI.Controllers
{
[ApiController]
[Route("[controller]")]
public class TestPostingController : ControllerBase
{
[HttpPost]
public int Area([FromForm] int height , int altitude)
{
//DBchat.SendPost(ReceivedPost);
Console.WriteLine("Received! " + height + " " + altitude );
return 200;
}
}
}

211
DBControllers/DBchat.cs Normal file
View File

@ -0,0 +1,211 @@
using NeDvachAPI.Models;
using Npgsql;
namespace NeDvachAPI.DBControllers
{
public class DBchat
{
public static List<Post> PostsList(string boardName, int thread)
{
List<Post> posts = new List<Post>();
string connString =
string.Format(
"Server={0}; User Id={1}; Database={2}; Port={3}; Password={4};SSLMode=Prefer",
AuthInfo.DB.Host,
AuthInfo.DB.User,
AuthInfo.DB.DBname,
AuthInfo.DB.Port,
AuthInfo.DB.Password);
using (var conn = new NpgsqlConnection(connString))
{
conn.Open();
using (var command = new NpgsqlCommand($@"
SELECT * FROM
(
SELECT post_id, post_text, content, post_timestamp
FROM posts
WHERE thread_id = {thread}
ORDER BY post_id DESC
) subquery
ORDER BY post_id ASC", conn))
{
var reader = command.ExecuteReader();
while (reader.Read())
{
Post receivedPost = new()
{
Id = reader.GetInt32(0),
Text = reader.GetString(1),
ImgURL = reader.IsDBNull(2) ? null : reader.GetFieldValue<string[]>(2),
Timestamp = reader.GetString(3)
};
posts.Add(receivedPost);
}
reader.Close();
}
}
return posts;
}
public static List<Post> ThreadsList(string boardName)
{
List<Post> posts = new List<Post>();
string connString =
string.Format(
"Server={0}; User Id={1}; Database={2}; Port={3}; Password={4};SSLMode=Prefer",
AuthInfo.DB.Host,
AuthInfo.DB.User,
AuthInfo.DB.DBname,
AuthInfo.DB.Port,
AuthInfo.DB.Password);
using (var conn = new NpgsqlConnection(connString))
{
conn.Open();
using (var command = new NpgsqlCommand($@"
SELECT * FROM
(
SELECT post_id, post_text, content, post_timestamp, is_op, thread_id
FROM posts
WHERE
is_op = {true}
ORDER BY thread_id DESC
) subquery
ORDER BY thread_id ASC", conn))
{
var reader = command.ExecuteReader();
while (reader.Read())
{
Post receivedPost = new()
{
Id = reader.GetInt32(0),
Text = reader.GetString(1),
ImgURL = reader.IsDBNull(2) ? null : reader.GetFieldValue<string[]>(2),
Timestamp = reader.GetString(3),
Is_OP = reader.GetBoolean(4),
Thread_Id = reader.GetInt32(5)
};
posts.Add(receivedPost);
}
reader.Close();
}
}
return posts;
}
public static void DbUpdate(string id, string text)
{
string connString =
string.Format(
"Server={0}; User Id={1}; Database={2}; Port={3}; Password={4};SSLMode=Prefer",
AuthInfo.DB.Host,
AuthInfo.DB.User,
AuthInfo.DB.DBname,
AuthInfo.DB.Port,
AuthInfo.DB.Password);
using (var conn = new NpgsqlConnection(connString))
{
conn.Open();
using (var command = new NpgsqlCommand("UPDATE dvach " +
"SET post = @postText WHERE post_id = @ID", conn))
{
command.Parameters.AddWithValue("ID", int.Parse(id));
command.Parameters.AddWithValue("postText", text);
int nRows = command.ExecuteNonQuery();
Console.Out.WriteLine(string.Format("Number of rows updated={0}", nRows));
}
}
Console.WriteLine("Данные обновлены!");
Console.ReadLine();
}
public static void SendPost(Post postToSend) //sending post to database
{
string connString =
string.Format(
"Server={0}; User Id={1}; Database={2}; Port={3}; Password={4};SSLMode=Prefer",
AuthInfo.DB.Host,
AuthInfo.DB.User,
AuthInfo.DB.DBname,
AuthInfo.DB.Port,
AuthInfo.DB.Password);
using (var conn = new NpgsqlConnection(connString))
{
conn.Open();
int postNum = 14;
using (var command = new NpgsqlCommand(@"
INSERT INTO posts (post_id, post_text, post_number, content, thread_id, auth_ip, is_op, post_timestamp)
VALUES (
DEFAULT,
@postText,
@postNum,
@postImgUrl,
@threadId,
@ip,
false,
(
SELECT date_trunc(
'second',
(now()::timestamp(0) AT TIME ZONE 'UTC+10')::TIMESTAMP
)
) )", conn))
{
command.Parameters.AddWithValue("postText", postToSend.Text);
command.Parameters.AddWithValue("postNum", postNum);
command.Parameters.AddWithValue("postImgUrl", postToSend.ImgURL);
command.Parameters.AddWithValue("threadId", postToSend.Thread_Id);
command.Parameters.AddWithValue("ip", postToSend.Ip);
int nRows = command.ExecuteNonQuery();
Console.Out.WriteLine("Добавлен пост с текстом " + postToSend.Text + " номером " + 22);
}
}
}
public static void DeletePost(string idToDel) //удалялка
{
string connString =
string.Format(
"Server={0}; User Id={1}; Database={2}; Port={3}; Password={4};SSLMode=Prefer",
AuthInfo.DB.Host,
AuthInfo.DB.User,
AuthInfo.DB.DBname,
AuthInfo.DB.Port,
AuthInfo.DB.Password);
using (var conn = new NpgsqlConnection(connString))
{
conn.Open();
using (var command = new NpgsqlCommand(@"
DELETE FROM dvach
WHERE post_id = @ID", conn))
{
command.Parameters.AddWithValue("ID", int.Parse(idToDel)); ;
int nRows = command.ExecuteNonQuery();
Console.Out.WriteLine(string.Format("Number of rows updated={0}", nRows));
}
}
Console.WriteLine("Данные удалены!");
Console.ReadLine();
}
}
}

View File

@ -0,0 +1,43 @@
using SkiaSharp;
namespace NeDvachAPI.DBControllers
{
public class ImageController
{
public static bool CheckExtention(string extentionToCheck)
{
var supportedTypes = new[] { ".jpg", ".png", ".jpeg" };
if (supportedTypes.Contains(extentionToCheck.ToLower()))
{
return true;
}
else return false;
}
public static bool ResizeImage(string picPath, string smallPath, int width, int height)
{
var bitmap = SKBitmap.Decode(picPath);
double ratio = Math.Max((double)bitmap.Width / (double)width , (double)bitmap.Height / (double)height);
int targetWidth = (int)(bitmap.Width/ ratio);
int targetHeight = (int)(bitmap.Height / ratio);
Console.WriteLine($"Ресайзим картинку до {targetWidth} ширины и {targetHeight} высоты.");
var dstInfo = new SKImageInfo(targetWidth , targetHeight);
var image = SKImage.FromBitmap(bitmap.Resize(dstInfo, SKFilterQuality.Medium));
var data = image.Encode(SKEncodedImageFormat.Jpeg, 90);
using (var stream = new FileStream(smallPath, FileMode.Create, FileAccess.Write))
data.SaveTo(stream);
data.Dispose();
image.Dispose();
bitmap.Dispose();
return true;
}
}
}

View File

@ -0,0 +1,36 @@
using Microsoft.AspNetCore.Mvc;
using Minio.DataModel;
using Minio;
using System.Security.Cryptography;
namespace NeDvachAPI.DBControllers
{
public class MinIOchat
{
public static async Task<JsonResult> PictureUpload(string fileroute, string filename, string bucket)
{
MinioClient DvachIo = new MinioClient()
.WithEndpoint(AuthInfo.MinIo.endpoint)
.WithCredentials(AuthInfo.MinIo.username, AuthInfo.MinIo.password)
//.WithSSL()
.Build();
Aes aesEncryption = Aes.Create();
aesEncryption.KeySize = 256;
aesEncryption.GenerateKey();
var ssec = new SSEC(aesEncryption.Key);
PutObjectArgs putObjectArgs = new PutObjectArgs()
.WithBucket(bucket)
.WithObject(filename)
.WithFileName(fileroute)
.WithContentType("image/png");
//.WithServerSideEncryption(ssec);
await DvachIo.PutObjectAsync(putObjectArgs);
GC.Collect();
GC.WaitForPendingFinalizers();
File.Delete(fileroute);
return new JsonResult("http://static.vdk2ch.ru:15555/thread-pics/" + filename);
}
}
}

181
DBchat.cs
View File

@ -1,181 +0,0 @@
using Npgsql;
using static System.Net.Mime.MediaTypeNames;
namespace NeDvachAPI
{
public class DBchat
{
// Obtain connection string information from the portal
private static string Host = "postgres.vdk2ch.ru";
private static string User = "postgres";
private static string DBname = "postgres";
private static string Password = "postgres";
private static string Port = "5432";
public static List<Post> DbList()
{
// Build connection string using parameters from portal
//Post[] posts = new Post[10];
List<Post> posts = new List<Post>();
//int postCount = 0;
string received = "";
string connString =
String.Format(
"Server={0}; User Id={1}; Database={2}; Port={3}; Password={4};SSLMode=Prefer",
Host,
User,
DBname,
Port,
Password);
using (var conn = new NpgsqlConnection(connString))
{
conn.Open();
// using ( var command = new NpgsqlCommand(@"
// SELECT * FROM
// (SELECT post_id, substring(post,1,200)
// FROM dvach
// ORDER BY post_id DESC
// limit 10
// )
// subquery ORDER BY post_id ASC", conn) )
using ( var command = new NpgsqlCommand(@"
SELECT * FROM
(
SELECT post_id, post, post_timestamp, post_pic
FROM dvach
ORDER BY post_id DESC
) subquery
ORDER BY post_id ASC", conn) )
{
var reader = command.ExecuteReader();
while (reader.Read())
{
//received +=(
//string.Format(
//"#{0}: {1}" + "\n",
// reader.GetInt32(0).ToString(),
//reader.GetString(1)
//)
//);
Post receivedPost = new()
{
Id = reader.GetInt32(0),
Text = reader.GetString(1),
Timestamp = reader.GetString(2),
ImgURL = (string)reader.GetString(3)
};
posts.Add(receivedPost);
//posts[postCount] = receivedPost;
//postCount++;
}
reader.Close();
}
}
return posts;
}
public static void DbUpdate(string id, string text)
{
string connString =
String.Format(
"Server={0}; User Id={1}; Database={2}; Port={3}; Password={4};SSLMode=Prefer",
Host,
User,
DBname,
Port,
Password);
using (var conn = new NpgsqlConnection(connString))
{
conn.Open();
using (var command = new NpgsqlCommand("UPDATE dvach " +
"SET post = @postText WHERE post_id = @ID", conn))
{
command.Parameters.AddWithValue("ID", int.Parse(id));
command.Parameters.AddWithValue("postText", text);
int nRows = command.ExecuteNonQuery();
Console.Out.WriteLine(String.Format("Number of rows updated={0}", nRows));
}
}
Console.WriteLine("Данные обновлены!");
Console.ReadLine();
}
public static void SendPost(Post postToSend) //добавлялка
{
string connString =
String.Format(
"Server={0}; User Id={1}; Database={2}; Port={3}; Password={4};SSLMode=Prefer",
Host,
User,
DBname,
Port,
Password);
using (var conn = new NpgsqlConnection(connString))
{
Console.Out.WriteLine("Opening connection");
conn.Open();
using (var command = new NpgsqlCommand(@"
INSERT INTO dvach (post_id, post, post_timestamp)
VALUES ( DEFAULT, @postText, (
SELECT date_trunc(
'second',
(now()::timestamp(0) AT TIME ZONE 'UTC+10')::TIMESTAMP
)
) )", conn))
{
command.Parameters.AddWithValue("postText", postToSend.Text);
//command.Parameters.AddWithValue("postTimeStamp", DateTime.Now.ToString("dd/MM/yyyy HH:mm"));
int nRows = command.ExecuteNonQuery();
Console.Out.WriteLine("Добавлен пост");
}
}
}
public static void DeletePost(string idToDel) //удалялка
{
string connString =
String.Format(
"Server={0}; User Id={1}; Database={2}; Port={3}; Password={4};SSLMode=Prefer",
Host,
User,
DBname,
Port,
Password);
using (var conn = new NpgsqlConnection(connString))
{
//Console.Out.WriteLine("Opening connection");
conn.Open();
using (var command = new NpgsqlCommand(@"
DELETE FROM dvach
WHERE post_id = @ID", conn))
{
command.Parameters.AddWithValue("ID", int.Parse(idToDel)); ;
int nRows = command.ExecuteNonQuery();
Console.Out.WriteLine(String.Format("Number of rows updated={0}", nRows));
}
}
Console.WriteLine("Данные удалены!");
Console.ReadLine();
}
}
}

View File

@ -1,5 +1,7 @@
FROM mcr.microsoft.com/dotnet/aspnet:6.0 FROM mcr.microsoft.com/dotnet/aspnet:6.0
ADD dist /app ADD dist /app
WORKDIR /app WORKDIR /app

14
Models/Post.cs Normal file
View File

@ -0,0 +1,14 @@
namespace NeDvachAPI.Models
{
public class Post
{
public string Timestamp { get; set; }
public int Id { get; set; }
public string Text { get; set; }
public string[]? ImgURL { get; set; }
public int Thread_Id { get; set; }
public bool Is_OP { get; set; }
public bool Is_Deleted { get; set; }
public string? Ip { get; set; }
}
}

View File

@ -7,8 +7,17 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Npgsql" Version="6.0.7" /> <PackageReference Include="Microsoft.AspNet.WebApi.Core" Version="5.2.9" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> <PackageReference Include="Minio" Version="4.0.6" />
<PackageReference Include="Npgsql" Version="7.0.0" />
<PackageReference Include="SkiaSharp" Version="2.88.3" />
<PackageReference Include="SkiaSharp.NativeAssets.Linux.NoDependencies" Version="2.88.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />
</ItemGroup>
<ItemGroup>
<Folder Include="Buffer\" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -3,5 +3,9 @@
<PropertyGroup> <PropertyGroup>
<Controller_SelectedScaffolderID>MvcControllerEmptyScaffolder</Controller_SelectedScaffolderID> <Controller_SelectedScaffolderID>MvcControllerEmptyScaffolder</Controller_SelectedScaffolderID>
<Controller_SelectedScaffolderCategoryPath>root/Common/MVC/Controller</Controller_SelectedScaffolderCategoryPath> <Controller_SelectedScaffolderCategoryPath>root/Common/MVC/Controller</Controller_SelectedScaffolderCategoryPath>
<ActiveDebugProfile>NeDvachAPI</ActiveDebugProfile>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebuggerFlavor>ProjectDebugger</DebuggerFlavor>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

13
Post.cs
View File

@ -1,13 +0,0 @@
namespace NeDvachAPI
{
public class Post
{
public string? Timestamp { get; set; }
public int Id { get; set; }
public string Text { get; set; }
public string ImgURL { get; set; }
}
}

View File

@ -1,12 +1,11 @@
var builder = WebApplication.CreateBuilder(args); using NeDvachAPI.BufferControllers;
// Add services to the container. var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(); builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpointsApiExplorer();
builder.Services.AddCors(setup => builder.Services.AddCors(setup =>
{ {
setup.AddDefaultPolicy(policyBuilder => setup.AddDefaultPolicy(policyBuilder =>
@ -19,18 +18,12 @@ builder.Services.AddCors(setup =>
}); });
//builder.Services.AddSwaggerGen();
var app = builder.Build(); var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment()) if (app.Environment.IsDevelopment())
{ {
//app.UseSwagger();
//app.UseSwaggerUI();
}
//app.UseHttpsRedirection(); }
app.UseCors(); app.UseCors();
@ -38,4 +31,12 @@ app.UseAuthorization();
app.MapControllers(); app.MapControllers();
app.Run(); app.UseHttpsRedirection();
if (BufferFill.FillBuffer("b"))
{
Console.WriteLine("Ready for work.");
app.Run();
}
else Console.WriteLine("Ошибка буферизации, проверьте доступность базы данных.");

View File

@ -1,4 +1,22 @@
{ {
"profiles": {
"NeDvachAPI": {
"commandName": "Project",
"launchUrl": "Home",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"dotnetRunMessages": true,
"applicationUrl": "https://0.0.0.0:7141"
},
"IIS Express": {
"commandName": "IISExpress",
"launchUrl": "Home",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
},
"$schema": "https://json.schemastore.org/launchsettings.json", "$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": { "iisSettings": {
"windowsAuthentication": false, "windowsAuthentication": false,
@ -7,25 +25,5 @@
"applicationUrl": "http://0.0.0.0:31551", "applicationUrl": "http://0.0.0.0:31551",
"sslPort": 44346 "sslPort": 44346
} }
},
"profiles": {
"NeDvachAPI": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "Home",
"applicationUrl": "http://0.0.0.0:7141;http://0.0.0.0:5141",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "Home",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
} }
} }

View File

@ -1,4 +1,5 @@
{ {
"https_port": 443,
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {
"Default": "Debug", "Default": "Debug",

View File

@ -10,3 +10,8 @@ services:
restart: always restart: always
ports: ports:
- "5000:80" - "5000:80"
logging:
driver: "gelf"
options:
gelf-address: "udp://graylog.vdk2ch.ru:12201"
tag: "backend-logs"

5
libman.json Normal file
View File

@ -0,0 +1,5 @@
{
"version": "1.0",
"defaultProvider": "cdnjs",
"libraries": []
}

0
newFile.txt Normal file
View File