Compare commits

...

3 Commits

Author SHA1 Message Date
Владимир Данилов
74adae9fc2 Lab8 2024-05-22 01:47:51 +04:00
Владимир Данилов
0a3d0f073f 1000 по id 2024-05-20 17:19:20 +04:00
Владимир Данилов
cb6251ab2b Лаба4 2024-05-19 21:59:55 +04:00
48 changed files with 4103 additions and 0 deletions

43
NewsBlog/NewsBlog.sln Normal file
View File

@ -0,0 +1,43 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.8.34330.188
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NewsBlogView", "NewsBlogView\NewsBlogView.csproj", "{13D9F9B7-6693-4D26-8178-08389235382C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NewsBlogAbstractions", "NewsBlogAbstractions\NewsBlogAbstractions.csproj", "{22CA3930-4C19-4623-9B58-C42A48B45576}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NewsBlogDatabaseImplementation", "NewsBlogDatabaseImplementation\NewsBlogDatabaseImplementation.csproj", "{1DA49583-881B-4E05-A128-AEB692A174B4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NewsBlogMongoDB", "NewsBlogMongoDB\NewsBlogMongoDB.csproj", "{223BAF22-6898-427D-A5D2-6D32BC50BD30}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{13D9F9B7-6693-4D26-8178-08389235382C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{13D9F9B7-6693-4D26-8178-08389235382C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{13D9F9B7-6693-4D26-8178-08389235382C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{13D9F9B7-6693-4D26-8178-08389235382C}.Release|Any CPU.Build.0 = Release|Any CPU
{22CA3930-4C19-4623-9B58-C42A48B45576}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{22CA3930-4C19-4623-9B58-C42A48B45576}.Debug|Any CPU.Build.0 = Debug|Any CPU
{22CA3930-4C19-4623-9B58-C42A48B45576}.Release|Any CPU.ActiveCfg = Release|Any CPU
{22CA3930-4C19-4623-9B58-C42A48B45576}.Release|Any CPU.Build.0 = Release|Any CPU
{1DA49583-881B-4E05-A128-AEB692A174B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1DA49583-881B-4E05-A128-AEB692A174B4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1DA49583-881B-4E05-A128-AEB692A174B4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1DA49583-881B-4E05-A128-AEB692A174B4}.Release|Any CPU.Build.0 = Release|Any CPU
{223BAF22-6898-427D-A5D2-6D32BC50BD30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{223BAF22-6898-427D-A5D2-6D32BC50BD30}.Debug|Any CPU.Build.0 = Debug|Any CPU
{223BAF22-6898-427D-A5D2-6D32BC50BD30}.Release|Any CPU.ActiveCfg = Release|Any CPU
{223BAF22-6898-427D-A5D2-6D32BC50BD30}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {F171E585-9195-4FAC-AF2A-ADEE7DC12398}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogAbstractions.Models
{
public class Article
{
public int Id { get; set; }
public string Title { get; set; } = string.Empty;
public string Content { get; set; } = string.Empty;
public DateTime PublicationDate { get; set; }
public int AuthorId { get; set; }
public int CategoryId { get; set; }
}
}

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogAbstractions.Models
{
public class Author
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public string Phone { get; set; } = string.Empty;
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogAbstractions.Models
{
public class Category
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
}
}

View File

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogAbstractions.Models
{
public class Comment
{
public int Id { get; set; }
public string Title { get; set; } = string.Empty;
public string Content { get; set; } = string.Empty;
public DateTime CreateDate { get; set; }
public int ArticleId { get; set; }
}
}

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogAbstractions.Models
{
public class Tag
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public int ArticleId { get; set; }
}
}

View File

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,22 @@
using NewsBlogAbstractions.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogAbstractions.WorkAbstractions
{
public interface IArticleWork
{
List<Article> GetAll();
Article? Get(int id);
Article? Create(Article article);
Article? Update(Article article);
Article? Delete(int id);
}
}

View File

@ -0,0 +1,24 @@
using NewsBlogAbstractions.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogAbstractions.WorkAbstractions
{
public interface IAuthorWork
{
List<Author> GetAll();
Author? Get(int id);
Author? Create(Author author);
Author? CreateId(Author author);
Author? Update(Author author);
Author? Delete(int id);
}
}

View File

@ -0,0 +1,22 @@
using NewsBlogAbstractions.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogAbstractions.WorkAbstractions
{
public interface ICategoryWork
{
List<Category> GetAll();
Category? Get(int id);
Category? Create(Category category);
Category? Update(Category category);
Category? Delete(int id);
}
}

View File

@ -0,0 +1,22 @@
using NewsBlogAbstractions.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogAbstractions.WorkAbstractions
{
public interface ICommentWork
{
List<Comment> GetAll();
Comment? Get(int id);
Comment? Create(Comment comment);
Comment? Update(Comment comment);
Comment? Delete(int id);
}
}

View File

@ -0,0 +1,22 @@
using NewsBlogAbstractions.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogAbstractions.WorkAbstractions
{
public interface ITagWork
{
List<Tag> GetAll();
Tag? Get(int id);
Tag? Create(Tag tag);
Tag? Update(Tag tag);
Tag? Delete(int id);
}
}

View File

@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.4" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NewsBlogAbstractions\NewsBlogAbstractions.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,12 @@
using Npgsql;
namespace NewsBlogDatabaseImplementation
{
public class SqlConnection
{
public static NpgsqlConnection GetConnection()
{
return new NpgsqlConnection("Host=192.168.56.103;Port=5432;Username=postgres;Database=postgres;Password=postgres");
}
}
}

View File

@ -0,0 +1,93 @@
using NewsBlogAbstractions.Models;
using NewsBlogAbstractions.WorkAbstractions;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogDatabaseImplementation.WorkImplementation
{
public class ArticleWork : IArticleWork
{
public Article? Create(Article article)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("INSERT INTO article (title, content, publication_date, author_id, category_id) VALUES (@Title, @Content, @Publication_date, @Author_id, @Category_id)", con);
cmd.Parameters.AddWithValue("@Title", article.Title);
cmd.Parameters.AddWithValue("@Content", article.Content);
cmd.Parameters.AddWithValue("@Publication_date", article.PublicationDate);
cmd.Parameters.AddWithValue("@Author_id", article.AuthorId == 0 ? DBNull.Value : article.AuthorId);
cmd.Parameters.AddWithValue("@Category_id", article.CategoryId == 0 ? DBNull.Value : article.CategoryId);
cmd.ExecuteNonQuery();
return article;
}
public Article? Delete(int id)
{
var element = Get(id);
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"DELETE FROM article WHERE article_id = {id}", con);
cmd.ExecuteNonQuery();
return element;
}
public Article? Get(int id)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"SELECT * FROM article WHERE article_id = {id}", con);
using var reader = cmd.ExecuteReader();
if (reader.Read())
{
return new Article
{
Id = reader.GetInt32(0),
Title = reader.GetString(1),
Content = reader.GetString(2),
PublicationDate = reader.GetDateTime(3),
AuthorId = !reader.IsDBNull(4) ? reader.GetInt32(4) : 0,
CategoryId = !reader.IsDBNull(5) ? reader.GetInt32(5) : 0,
};
}
return null;
}
public List<Article> GetAll()
{
var articles = new List<Article>();
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("SELECT * FROM article order by article_id", con);
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
articles.Add(new Article
{
Id = reader.GetInt32(0),
Title = reader.GetString(1),
Content = reader.GetString(2),
PublicationDate = reader.GetDateTime(3),
AuthorId = !reader.IsDBNull(4) ? reader.GetInt32(4) : 0,
CategoryId = !reader.IsDBNull(5) ? reader.GetInt32(5) : 0,
});
}
return articles;
}
public Article? Update(Article article)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"UPDATE article SET title = '{article.Title}', content = '{article.Content}', publication_date = '{article.PublicationDate}', author_id = @Author_Id, category_id = @Category_id WHERE article_id = {article.Id}", con);
cmd.Parameters.AddWithValue("@Author_Id", article.AuthorId == 0 ? DBNull.Value : article.AuthorId);
cmd.Parameters.AddWithValue("@Category_Id", article.CategoryId == 0 ? DBNull.Value : article.CategoryId);
cmd.ExecuteNonQuery();
var element = Get(article.Id);
return element;
}
}
}

View File

@ -0,0 +1,98 @@
using NewsBlogAbstractions.Models;
using NewsBlogAbstractions.WorkAbstractions;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogDatabaseImplementation.WorkImplementation
{
public class AuthorWork : IAuthorWork
{
public Author? Create(Author author)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("INSERT INTO author (name, description, phone) VALUES (@Name, @Description, @Phone)", con);
cmd.Parameters.AddWithValue("@Name", author.Name);
cmd.Parameters.AddWithValue("@Description", author.Description);
cmd.Parameters.AddWithValue("@Phone", author.Phone);
cmd.ExecuteNonQuery();
return author;
}
public Author? CreateId(Author author)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("INSERT INTO author (author_id, name, description, phone) VALUES (@Author_id, @Name, @Description, @Phone)", con);
cmd.Parameters.AddWithValue("@Author_id", author.Id);
cmd.Parameters.AddWithValue("@Name", author.Name);
cmd.Parameters.AddWithValue("@Description", author.Description);
cmd.Parameters.AddWithValue("@Phone", author.Phone);
cmd.ExecuteNonQuery();
return author;
}
public Author? Delete(int id)
{
var element = Get(id);
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"DELETE FROM author WHERE author_id = {id}", con);
cmd.ExecuteNonQuery();
return element;
}
public Author? Get(int id)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"SELECT * FROM author WHERE author_id = {id}", con);
using var reader = cmd.ExecuteReader();
if (reader.Read())
{
return new Author
{
Id = reader.GetInt32(0),
Name = reader.GetString(1),
Description = reader.GetString(2),
Phone = reader.GetString(3),
};
}
return null;
}
public List<Author> GetAll()
{
var authors = new List<Author>();
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("SELECT * FROM author order by author_id", con);
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
authors.Add(new Author
{
Id = reader.GetInt32(0),
Name = reader.GetString(1),
Description = reader.GetString(2),
Phone = reader.GetString(3),
});
}
return authors;
}
public Author? Update(Author author)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"UPDATE author SET name = '{author.Name}', description = '{author.Description}', phone = '{author.Phone}' WHERE author_id = {author.Id}", con);
cmd.ExecuteNonQuery();
var element = Get(author.Id);
return element;
}
}
}

View File

@ -0,0 +1,79 @@
using NewsBlogAbstractions.Models;
using NewsBlogAbstractions.WorkAbstractions;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogDatabaseImplementation.WorkImplementation
{
public class CategoryWork : ICategoryWork
{
public Category? Create(Category category)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("INSERT INTO category (name) VALUES (@Name)", con);
cmd.Parameters.AddWithValue("@Name", category.Name);
cmd.ExecuteNonQuery();
return category;
}
public Category? Delete(int id)
{
var element = Get(id);
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"DELETE FROM category WHERE category_id = {id}", con);
cmd.ExecuteNonQuery();
return element;
}
public Category? Get(int id)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"SELECT * FROM category WHERE category_id = {id}", con);
using var reader = cmd.ExecuteReader();
if (reader.Read())
{
return new Category
{
Id = reader.GetInt32(0),
Name = reader.GetString(1),
};
}
return null;
}
public List<Category> GetAll()
{
var categorys = new List<Category>();
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("SELECT * FROM category order by category_id", con);
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
categorys.Add(new Category
{
Id = reader.GetInt32(0),
Name = reader.GetString(1),
});
}
return categorys;
}
public Category? Update(Category category)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"UPDATE category SET name = '{category.Name}' WHERE category_id = {category.Id}", con);
cmd.ExecuteNonQuery();
var element = Get(category.Id);
return element;
}
}
}

View File

@ -0,0 +1,89 @@
using NewsBlogAbstractions.Models;
using NewsBlogAbstractions.WorkAbstractions;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogDatabaseImplementation.WorkImplementation
{
public class CommentWork : ICommentWork
{
public Comment? Create(Comment comment)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("INSERT INTO comment (title, content, create_date, article_id) VALUES (@Title, @Content, @Create_date, @Article_id)", con);
cmd.Parameters.AddWithValue("@Title", comment.Title);
cmd.Parameters.AddWithValue("@Content", comment.Content);
cmd.Parameters.AddWithValue("@Create_date", comment.CreateDate);
cmd.Parameters.AddWithValue("@Article_id", comment.ArticleId == 0 ? DBNull.Value : comment.ArticleId);
cmd.ExecuteNonQuery();
return comment;
}
public Comment? Delete(int id)
{
var element = Get(id);
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"DELETE FROM comment WHERE comment_id = {id}", con);
cmd.ExecuteNonQuery();
return element;
}
public Comment? Get(int id)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"SELECT * FROM comment WHERE comment_id = {id}", con);
using var reader = cmd.ExecuteReader();
if (reader.Read())
{
return new Comment
{
Id = reader.GetInt32(0),
Title = reader.GetString(1),
Content = reader.GetString(2),
CreateDate = reader.GetDateTime(3),
ArticleId = !reader.IsDBNull(4) ? reader.GetInt32(4) : 0,
};
}
return null;
}
public List<Comment> GetAll()
{
var comments = new List<Comment>();
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("SELECT * FROM comment order by comment_id", con);
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
comments.Add(new Comment
{
Id = reader.GetInt32(0),
Title = reader.GetString(1),
Content = reader.GetString(2),
CreateDate = reader.GetDateTime(3),
ArticleId = !reader.IsDBNull(4) ? reader.GetInt32(4) : 0,
});
}
return comments;
}
public Comment? Update(Comment comment)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"UPDATE comment SET title = '{comment.Title}', content = '{comment.Content}', create_date = '{comment.CreateDate}', article_id = @Article_Id WHERE comment_id = {comment.Id}", con);
cmd.Parameters.AddWithValue("@Article_Id", comment.ArticleId == 0 ? DBNull.Value : comment.ArticleId);
cmd.ExecuteNonQuery();
var element = Get(comment.Id);
return element;
}
}
}

View File

@ -0,0 +1,86 @@
using NewsBlogAbstractions.Models;
using NewsBlogAbstractions.WorkAbstractions;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogDatabaseImplementation.WorkImplementation
{
public class TagWork : ITagWork
{
public Tag? Create(Tag tag)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("INSERT INTO tag (name, description, article_id) VALUES (@Name, @Description, @Article_id)", con);
cmd.Parameters.AddWithValue("@Name", tag.Name);
cmd.Parameters.AddWithValue("@Description", tag.Description);
cmd.Parameters.AddWithValue("@Article_id", tag.ArticleId == 0 ? DBNull.Value : tag.ArticleId);
cmd.ExecuteNonQuery();
return tag;
}
public Tag? Delete(int id)
{
var element = Get(id);
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"DELETE FROM tag WHERE tag_id = {id}", con);
cmd.ExecuteNonQuery();
return element;
}
public Tag? Get(int id)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"SELECT * FROM tag WHERE tag_id = {id}", con);
using var reader = cmd.ExecuteReader();
if (reader.Read())
{
return new Tag
{
Id = reader.GetInt32(0),
Name = reader.GetString(1),
Description = reader.GetString(2),
ArticleId = !reader.IsDBNull(3) ? reader.GetInt32(3) : 0,
};
}
return null;
}
public List<Tag> GetAll()
{
var tags = new List<Tag>();
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand("SELECT * FROM tag order by tag_id", con);
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
tags.Add(new Tag
{
Id = reader.GetInt32(0),
Name = reader.GetString(1),
Description = reader.GetString(2),
ArticleId = !reader.IsDBNull(3) ? reader.GetInt32(3) : 0,
});
}
return tags;
}
public Tag? Update(Tag tag)
{
using var con = SqlConnection.GetConnection();
con.Open();
using var cmd = new NpgsqlCommand($"UPDATE tag SET name = '{tag.Name}', description = '{tag.Description}', article_id = @Article_Id WHERE tag_id = {tag.Id}", con);
cmd.Parameters.AddWithValue("@Article_Id", tag.ArticleId == 0 ? DBNull.Value : tag.ArticleId);
cmd.ExecuteNonQuery();
var element = Get(tag.Id);
return element;
}
}
}

View File

@ -0,0 +1,198 @@
using MongoDB.Driver;
using NewsBlogAbstractions.Models;
using NewsBlogMongoDB.Models;
using NewsBlogMongoDB.StoragesContracts;
using Tag = NewsBlogAbstractions.Models.Tag;
namespace NewsBlogMongoDB
{
public class ImplementationMongoDB: StorageModel
{
private IMongoDatabase _database;
private IMongoCollection<ArticleMongo> _articleCollection;
private IMongoCollection<AuthorMongo> _authorCollection;
private IMongoCollection<CategoryMongo> _categoryCollection;
private IMongoCollection<CommentMongo> _CommentCollection;
private IMongoCollection<TagMongo> _TagCollection;
private IMongoCollection<Sequence> _SequenceCollection;
public ImplementationMongoDB()
{
var client = new MongoClient("mongodb://localhost:27017");
_database = client.GetDatabase("NewsBlog");
_articleCollection = _database.GetCollection<ArticleMongo>("article");
_authorCollection = _database.GetCollection<AuthorMongo>("author");
_categoryCollection = _database.GetCollection<CategoryMongo>("category");
_CommentCollection = _database.GetCollection<CommentMongo>("comment");
_TagCollection = _database.GetCollection<TagMongo>("tag");
_SequenceCollection = _database.GetCollection<Sequence>("sequence");
}
// article
public override void AddArticle(Article article)
{
string Author_id = GetMongoId("Author", article.AuthorId.ToString());
string Category_id = GetMongoId("Category", article.CategoryId.ToString());
var art = new ArticleMongo(article, Author_id, Category_id);
_articleCollection.InsertOne(art);
var seq = new Sequence { Sql_id = article.Id.ToString(), Mongo_id = art.Id, Table_name = "Article"};
_SequenceCollection.InsertOne(seq);
}
public override List<ArticleMongo> GetArticles()
{
return _articleCollection.Find(_ => true).ToList();
}
public override ArticleMongo GetArticleById(string id)
{
return _articleCollection.Find(article => article.Id == id).FirstOrDefault();
}
public override void UpdateArticle(ArticleMongo article)
{
_articleCollection.ReplaceOne(c => c.Id == article.Id, article);
}
public override void DeleteArticle(string id)
{
_articleCollection.DeleteOne(article => article.Id == id);
}
// Author
public override void AddAuthor(Author author)
{
var art = new AuthorMongo(author);
_authorCollection.InsertOne(art);
var seq = new Sequence { Sql_id = author.Id.ToString(), Mongo_id = art.Id, Table_name = "Author" };
_SequenceCollection.InsertOne(seq);
}
public override List<AuthorMongo> GetAuthors()
{
return _authorCollection.Find(_ => true).ToList();
}
public override AuthorMongo GetAuthorById(string id)
{
return _authorCollection.Find(author => author.Id == id).FirstOrDefault();
}
public override void UpdateAuthor(AuthorMongo author)
{
_authorCollection.ReplaceOne(c => c.Id == author.Id, author);
}
public override void DeleteAuthor(string id)
{
_authorCollection.DeleteOne(author => author.Id == id);
}
// Category
public override void AddCategory(Category category)
{
var cat = new CategoryMongo(category);
_categoryCollection.InsertOne(cat);
var seq = new Sequence { Sql_id = category.Id.ToString(), Mongo_id = cat.Id, Table_name = "Category" };
_SequenceCollection.InsertOne(seq);
}
public override List<CategoryMongo> GetCategorys()
{
return _categoryCollection.Find(_ => true).ToList();
}
public override CategoryMongo GetCategoryById(string id)
{
return _categoryCollection.Find(category => category.Id == id).FirstOrDefault();
}
public override void UpdateCategory(CategoryMongo category)
{
_categoryCollection.ReplaceOne(r => r.Id == category.Id, category);
}
public override void DeleteCategory(string id)
{
_categoryCollection.DeleteOne(category => category.Id == id);
}
// Comment
public override void AddComment(Comment Comment)
{
string ArticleId = GetMongoId("Article", Comment.ArticleId.ToString());
_CommentCollection.InsertOne(new CommentMongo(Comment, ArticleId));
}
public override List<CommentMongo> GetComments()
{
return _CommentCollection.Find(_ => true).ToList();
}
public override CommentMongo GetCommentById(string id)
{
return _CommentCollection.Find(model => model.Id == id).FirstOrDefault();
}
public override void UpdateComment(CommentMongo Comment)
{
_CommentCollection.ReplaceOne(m => m.Id == Comment.Id, Comment);
}
public override void DeleteComment(string id)
{
_CommentCollection.DeleteOne(model => model.Id == id);
}
// Tag
public override void AddTag(Tag Tag)
{
string ArticleId = GetMongoId("Article", Tag.ArticleId.ToString());
_TagCollection.InsertOne(new TagMongo(Tag, ArticleId));
}
public override List<TagMongo> GetTags()
{
return _TagCollection.Find(_ => true).ToList();
}
public override TagMongo GetTagById(string id)
{
return _TagCollection.Find(Tag => Tag.Id == id).FirstOrDefault();
}
public override void UpdateTag(TagMongo Tag)
{
_TagCollection.ReplaceOne(b => b.Id == Tag.Id, Tag);
}
public override void DeleteTag(string id)
{
_TagCollection.DeleteOne(Tag => Tag.Id == id);
}
public List<Sequence> GetSequence()
{
return _SequenceCollection.Find(_ => true).ToList();
}
public override string GetMongoId(string tableName, string sqlId)
{
var sequence = _SequenceCollection.Find(s => s.Table_name == tableName && s.Sql_id == sqlId).FirstOrDefault();
return sequence?.Mongo_id ?? string.Empty;
}
public void DeleteSequence(string id)
{
_SequenceCollection.DeleteOne(Sequence => Sequence.Id == id);
}
}
}

View File

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Bson;
namespace NewsBlogMongoDB.Models
{
public class ArticleMongo
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string Title { get; set; } = string.Empty;
public string Content { get; set; } = string.Empty;
public string Publication_date { get; set; } = string.Empty;
public string Author_id { get; set; } = string.Empty;
public string Category_id { get; set; } = string.Empty;
public ArticleMongo(NewsBlogAbstractions.Models.Article model, string author_id, string category_id)
{
Title = model.Title;
Content = model.Content;
Publication_date = model.PublicationDate.ToString("d");
Author_id = author_id;
Category_id = category_id;
}
public ArticleMongo()
{
}
}
}

View File

@ -0,0 +1,31 @@
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Bson;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NewsBlogAbstractions.Models;
namespace NewsBlogMongoDB.Models
{
public class AuthorMongo
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string Name { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public string Phone { get; set; } = string.Empty;
public AuthorMongo(NewsBlogAbstractions.Models.Author model)
{
Name = model.Name;
Description = model.Description;
Phone = model.Phone;
}
public AuthorMongo()
{
}
}
}

View File

@ -0,0 +1,27 @@
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using NewsBlogAbstractions.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogMongoDB.Models
{
public class CategoryMongo
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string Name { get; set; } = string.Empty;
public CategoryMongo(NewsBlogAbstractions.Models.Category model)
{
Name = model.Name;
}
public CategoryMongo()
{
}
}
}

View File

@ -0,0 +1,33 @@
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using NewsBlogAbstractions.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogMongoDB.Models
{
public class CommentMongo
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string Title { get; set; } = string.Empty;
public string Content { get; set; } = string.Empty;
public string Create_date { get; set; } = string.Empty;
public string Article_id { get; set; } = string.Empty;
public CommentMongo(NewsBlogAbstractions.Models.Comment model, string ArticleId)
{
Title = model.Title;
Content = model.Content;
Create_date = model.CreateDate.ToString("d");
Article_id = ArticleId;
}
public CommentMongo()
{
}
}
}

View File

@ -0,0 +1,20 @@
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Bson;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogMongoDB.Models
{
public class Sequence
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; } = string.Empty;
public string Sql_id { get; set; } = string.Empty;
public string Mongo_id { get; set; } = string.Empty;
public string Table_name { get; set;} = string.Empty;
}
}

View File

@ -0,0 +1,31 @@
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Bson;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NewsBlogAbstractions.Models;
namespace NewsBlogMongoDB.Models
{
public class TagMongo
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string Name { get; set; } = string.Empty;
public string Decsription { get; set; } = string.Empty;
public string Article_id { get; set; } = string.Empty;
public TagMongo(NewsBlogAbstractions.Models.Tag model, string ArticleId)
{
Name = model.Name;
Decsription = model.Description;
Article_id = ArticleId;
}
public TagMongo()
{
}
}
}

View File

@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MongoDB.Driver" Version="2.25.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NewsBlogAbstractions\NewsBlogAbstractions.csproj" />
<ProjectReference Include="..\NewsBlogDatabaseImplementation\NewsBlogDatabaseImplementation.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,50 @@
using NewsBlogAbstractions.Models;
using NewsBlogMongoDB.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NewsBlogMongoDB.StoragesContracts
{
public abstract class StorageModel
{
// Article
public abstract void AddArticle(Article article);
public abstract List<ArticleMongo> GetArticles();
public abstract ArticleMongo GetArticleById(string id);
public abstract void UpdateArticle(ArticleMongo article);
public abstract void DeleteArticle(string id);
// Author
public abstract void AddAuthor(Author author);
public abstract AuthorMongo GetAuthorById(string id);
public abstract List<AuthorMongo> GetAuthors();
public abstract void UpdateAuthor(AuthorMongo author);
public abstract void DeleteAuthor(string id);
// Category
public abstract void AddCategory(Category category);
public abstract CategoryMongo GetCategoryById(string id);
public abstract List<CategoryMongo> GetCategorys();
public abstract void UpdateCategory(CategoryMongo category);
public abstract void DeleteCategory(string id);
// Comment
public abstract void AddComment(Comment comment);
public abstract CommentMongo GetCommentById(string id);
public abstract List<CommentMongo> GetComments();
public abstract void UpdateComment(CommentMongo comment);
public abstract void DeleteComment(string id);
// Tag
public abstract void AddTag(Tag tag);
public abstract TagMongo GetTagById(string id);
public abstract List<TagMongo> GetTags();
public abstract void UpdateTag(TagMongo tag);
public abstract void DeleteTag(string id);
public abstract string GetMongoId(string tableName, string sqlId);
}
}

View File

@ -0,0 +1,201 @@
using System.Windows.Forms;
namespace NewsBlogView
{
partial class FormArticle
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
buttonDelete = new Button();
buttonUpdate = new Button();
buttonCreate = new Button();
comboBoxAuthor = new ComboBox();
comboBoxCategory = new ComboBox();
textBoxTitle = new TextBox();
dataGridView = new DataGridView();
textBoxContent = new TextBox();
labelTitle = new Label();
labelContent = new Label();
labelAuthor = new Label();
labelCategory = new Label();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// buttonDelete
//
buttonDelete.Location = new Point(755, 292);
buttonDelete.Name = "buttonDelete";
buttonDelete.Size = new Size(128, 30);
buttonDelete.TabIndex = 28;
buttonDelete.Text = "Удалить";
buttonDelete.UseVisualStyleBackColor = true;
buttonDelete.Click += ButtonDelete_Click;
//
// buttonUpdate
//
buttonUpdate.Location = new Point(755, 256);
buttonUpdate.Name = "buttonUpdate";
buttonUpdate.Size = new Size(128, 30);
buttonUpdate.TabIndex = 27;
buttonUpdate.Text = "Изменить";
buttonUpdate.UseVisualStyleBackColor = true;
buttonUpdate.Click += ButtonUpdate_Click;
//
// buttonCreate
//
buttonCreate.Location = new Point(755, 220);
buttonCreate.Name = "buttonCreate";
buttonCreate.Size = new Size(128, 30);
buttonCreate.TabIndex = 26;
buttonCreate.Text = "Добавить";
buttonCreate.UseVisualStyleBackColor = true;
buttonCreate.Click += ButtonCreate_Click;
//
// comboBoxAuthor
//
comboBoxAuthor.FormattingEnabled = true;
comboBoxAuthor.Location = new Point(718, 129);
comboBoxAuthor.Margin = new Padding(3, 4, 3, 4);
comboBoxAuthor.Name = "comboBoxAuthor";
comboBoxAuthor.Size = new Size(201, 23);
comboBoxAuthor.TabIndex = 35;
//
// comboBoxCategory
//
comboBoxCategory.FormattingEnabled = true;
comboBoxCategory.Location = new Point(717, 174);
comboBoxCategory.Margin = new Padding(3, 4, 3, 4);
comboBoxCategory.Name = "comboBoxCategory";
comboBoxCategory.Size = new Size(201, 23);
comboBoxCategory.TabIndex = 35;
//
// textBoxTitle
//
textBoxTitle.Location = new Point(717, 41);
textBoxTitle.Name = "textBoxTitle";
textBoxTitle.Size = new Size(201, 23);
textBoxTitle.TabIndex = 21;
//
// dataGridView
//
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.BackgroundColor = SystemColors.Window;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Location = new Point(13, 14);
dataGridView.MultiSelect = false;
dataGridView.Name = "dataGridView";
dataGridView.RowHeadersWidth = 51;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(610, 608);
dataGridView.TabIndex = 15;
dataGridView.CellClick += DataGridView_CellClick;
//
// textBoxContent
//
textBoxContent.Location = new Point(717, 84);
textBoxContent.Name = "textBoxContent";
textBoxContent.Size = new Size(201, 23);
textBoxContent.TabIndex = 32;
//
// labelTitle
//
labelTitle.AutoSize = true;
labelTitle.Location = new Point(633, 44);
labelTitle.Name = "labelTitle";
labelTitle.Size = new Size(71, 15);
labelTitle.TabIndex = 31;
labelTitle.Text = "Заголовок: ";
//
// labelContent
//
labelContent.AutoSize = true;
labelContent.Location = new Point(629, 87);
labelContent.Name = "labelContent";
labelContent.Size = new Size(82, 15);
labelContent.TabIndex = 42;
labelContent.Text = "Содержимое:";
//
// labelAuthor
//
labelAuthor.AutoSize = true;
labelAuthor.Location = new Point(630, 132);
labelAuthor.Name = "labelAuthor";
labelAuthor.Size = new Size(43, 15);
labelAuthor.TabIndex = 44;
labelAuthor.Text = "Автор:";
//
// labelCategory
//
labelCategory.AutoSize = true;
labelCategory.Location = new Point(629, 177);
labelCategory.Name = "labelCategory";
labelCategory.Size = new Size(66, 15);
labelCategory.TabIndex = 44;
labelCategory.Text = "Категория:";
//
// FormArticle
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(990, 450);
Controls.Add(labelAuthor);
Controls.Add(labelContent);
Controls.Add(labelTitle);
Controls.Add(labelCategory);
Controls.Add(textBoxContent);
Controls.Add(buttonDelete);
Controls.Add(buttonUpdate);
Controls.Add(buttonCreate);
Controls.Add(textBoxTitle);
Controls.Add(dataGridView);
Controls.Add(comboBoxAuthor);
Controls.Add(comboBoxCategory);
Name = "FormArticle";
Text = "Статьи";
Load += FormArticle_Load;
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Button buttonDelete;
private Button buttonUpdate;
private Button buttonCreate;
private TextBox textBoxTitle;
private TextBox textBoxContent;
private ComboBox comboBoxAuthor;
private ComboBox comboBoxCategory;
private DataGridView dataGridView;
private Label labelTitle;
private Label labelContent;
private Label labelAuthor;
private Label labelCategory;
}
}

View File

@ -0,0 +1,190 @@
using NewsBlogAbstractions.Models;
using NewsBlogAbstractions.WorkAbstractions;
using NewsBlogMongoDB.Models;
using NewsBlogMongoDB.StoragesContracts;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace NewsBlogView
{
public partial class FormArticle : Form
{
private readonly IArticleWork _articleLogic;
private readonly IAuthorWork _authorLogic;
private readonly ICategoryWork _categoryLogic;
private readonly StorageModel _mongoLogic;
public FormArticle(IArticleWork articleLogic, IAuthorWork authorLogic, ICategoryWork categoryLogic, StorageModel mongoLogic)
{
InitializeComponent();
_articleLogic = articleLogic;
_authorLogic = authorLogic;
_categoryLogic = categoryLogic;
_mongoLogic = mongoLogic;
}
private void FormArticle_Load(object sender, EventArgs e)
{
LoadData();
}
private void ButtonCreate_Click(object sender, EventArgs e)
{
Article newArticle = new()
{
Title = textBoxTitle.Text,
Content = textBoxContent.Text,
PublicationDate = DateTime.Now,
AuthorId = ((Author?)comboBoxAuthor.SelectedItem)?.Id ?? 0,
CategoryId = ((Category?)comboBoxCategory.SelectedItem)?.Id ?? 0,
};
if (Program.isPostgreSQL)
_articleLogic.Create(newArticle);
else
_mongoLogic.AddArticle(newArticle);
LoadData();
}
private void LoadData()
{
var articlesSql = _articleLogic.GetAll();
var articlesMongo = _mongoLogic.GetArticles();
dataGridView.Rows.Clear();
if (dataGridView.ColumnCount == 0)
{
dataGridView.Columns.Add("Id", "ID");
dataGridView.Columns.Add("Title", "Заголовок");
dataGridView.Columns.Add("Content", "Содержимое");
dataGridView.Columns.Add("Date", "Дата публикации");
dataGridView.Columns.Add("AuthorId", "AuthorId");
dataGridView.Columns.Add("CategoryId", "CategoryId");
dataGridView.Columns["AuthorId"].Visible = false;
dataGridView.Columns["CategoryId"].Visible = false;
dataGridView.Columns.Add("Author", "Автор");
dataGridView.Columns.Add("Category", "Категория");
}
dataGridView.Columns["Id"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Title"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Content"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Date"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Author"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Category"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
comboBoxAuthor.DataSource = _authorLogic.GetAll();
comboBoxAuthor.DisplayMember = "Author";
comboBoxAuthor.ValueMember = "Name";
comboBoxCategory.DataSource = _categoryLogic.GetAll();
comboBoxCategory.DisplayMember = "Category";
comboBoxCategory.ValueMember = "Name";
if(Program.isPostgreSQL)
foreach (var article in articlesSql)
{
dataGridView.Rows.Add(article.Id, article.Title, article.Content, article.PublicationDate.ToString("d"),
article.AuthorId, article.CategoryId, _authorLogic.Get(article.AuthorId)?.Name, _categoryLogic.Get(article.CategoryId)?.Name);
}
else
foreach (var article in articlesMongo)
{
dataGridView.Rows.Add(article.Id, article.Title, article.Content, article.Publication_date,
article.Author_id, article.Category_id, _mongoLogic.GetAuthorById(article.Author_id)?.Name, _mongoLogic.GetCategoryById(article.Category_id)?.Name);
}
}
private void ButtonUpdate_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
if (Program.isPostgreSQL)
{
int articleId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
Article updatedArticle = new()
{
Id = articleId,
Title = textBoxTitle.Text,
Content = textBoxContent.Text,
PublicationDate = DateTime.Now,
AuthorId = ((Author?)comboBoxAuthor.SelectedItem)?.Id ?? 0,
CategoryId = ((Category?)comboBoxCategory.SelectedItem)?.Id ?? 0,
};
_articleLogic.Update(updatedArticle);
}
else
{
string? articleId = selectedRow.Cells["Id"].Value.ToString();
ArticleMongo updated = new()
{
Id = articleId,
Title = textBoxTitle.Text,
Content = textBoxContent.Text,
Publication_date = DateTime.Now.ToString("d"),
Author_id = _mongoLogic.GetMongoId("Author", ((Author?)comboBoxAuthor.SelectedItem)?.Id.ToString() ?? string.Empty),
Category_id = _mongoLogic.GetMongoId("Category", ((Category?)comboBoxCategory.SelectedItem)?.Id.ToString() ?? string.Empty),
};
_mongoLogic.UpdateArticle(updated);
}
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите статью, информацию о которой необходимо обновить");
}
}
private void ButtonDelete_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
if (Program.isPostgreSQL)
{
int articleId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
_articleLogic.Delete(articleId);
}
else
{
string? articleIdMongo = selectedRow.Cells["Id"].Value.ToString();
_mongoLogic.DeleteArticle(articleIdMongo);
}
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите статью, информацию о которой необходимо удалить");
}
}
private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = dataGridView.Rows[e.RowIndex];
textBoxTitle.Text = row.Cells["Title"].Value.ToString();
textBoxContent.Text = row.Cells["Content"].Value.ToString();
comboBoxAuthor.SelectedValue = row.Cells["Author"].Value ?? new Author { Name = "Неизвестный автор" };
comboBoxCategory.SelectedValue = row.Cells["Category"].Value ?? new Category { Name = "Неизвестная категория" };
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,175 @@
using System.Windows.Forms;
namespace NewsBlogView
{
partial class FormAuthor
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
buttonDelete = new Button();
buttonUpdate = new Button();
buttonCreate = new Button();
textBoxPhone = new TextBox();
textBoxName = new TextBox();
dataGridView = new DataGridView();
textBoxDescription = new TextBox();
labelName = new Label();
labelDescription = new Label();
labelPhone = new Label();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// buttonDelete
//
buttonDelete.Location = new Point(741, 292);
buttonDelete.Name = "buttonDelete";
buttonDelete.Size = new Size(128, 30);
buttonDelete.TabIndex = 28;
buttonDelete.Text = "Удалить";
buttonDelete.UseVisualStyleBackColor = true;
buttonDelete.Click += ButtonDelete_Click;
//
// buttonUpdate
//
buttonUpdate.Location = new Point(741, 256);
buttonUpdate.Name = "buttonUpdate";
buttonUpdate.Size = new Size(128, 30);
buttonUpdate.TabIndex = 27;
buttonUpdate.Text = "Изменить";
buttonUpdate.UseVisualStyleBackColor = true;
buttonUpdate.Click += ButtonUpdate_Click;
//
// buttonCreate
//
buttonCreate.Location = new Point(741, 220);
buttonCreate.Name = "buttonCreate";
buttonCreate.Size = new Size(128, 30);
buttonCreate.TabIndex = 26;
buttonCreate.Text = "Добавить";
buttonCreate.UseVisualStyleBackColor = true;
buttonCreate.Click += ButtonCreate_Click;
//
// textBoxPhone
//
textBoxPhone.Location = new Point(703, 131);
textBoxPhone.Name = "textBoxPhone";
textBoxPhone.Size = new Size(201, 23);
textBoxPhone.TabIndex = 35;
//
// textBoxName
//
textBoxName.Location = new Point(704, 41);
textBoxName.Name = "textBoxName";
textBoxName.Size = new Size(201, 23);
textBoxName.TabIndex = 21;
//
// dataGridView
//
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.BackgroundColor = SystemColors.Window;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Location = new Point(13, 14);
dataGridView.MultiSelect = false;
dataGridView.Name = "dataGridView";
dataGridView.RowHeadersWidth = 51;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(610, 608);
dataGridView.TabIndex = 15;
dataGridView.CellClick += DataGridView_CellClick;
//
// textBoxDescription
//
textBoxDescription.Location = new Point(703, 84);
textBoxDescription.Name = "textBoxDescription";
textBoxDescription.Size = new Size(201, 23);
textBoxDescription.TabIndex = 32;
//
// labelName
//
labelName.AutoSize = true;
labelName.Location = new Point(633, 44);
labelName.Name = "labelName";
labelName.Size = new Size(40, 15);
labelName.TabIndex = 31;
labelName.Text = "ФИО: ";
//
// labelDescription
//
labelDescription.AutoSize = true;
labelDescription.Location = new Point(629, 87);
labelDescription.Name = "labelDescription";
labelDescription.Size = new Size(68, 15);
labelDescription.TabIndex = 42;
labelDescription.Text = "Описание: ";
//
// labelPhone
//
labelPhone.AutoSize = true;
labelPhone.Location = new Point(629, 134);
labelPhone.Name = "labelPhone";
labelPhone.Size = new Size(58, 15);
labelPhone.TabIndex = 44;
labelPhone.Text = "Телефон:";
//
// FormAuthor
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(990, 450);
Controls.Add(labelPhone);
Controls.Add(labelDescription);
Controls.Add(labelName);
Controls.Add(buttonDelete);
Controls.Add(buttonUpdate);
Controls.Add(buttonCreate);
Controls.Add(textBoxName);
Controls.Add(textBoxDescription);
Controls.Add(textBoxPhone);
Controls.Add(dataGridView);
Name = "FormAuthor";
Text = "Авторы";
Load += FormAuthor_Load;
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Button buttonDelete;
private Button buttonUpdate;
private Button buttonCreate;
private TextBox textBoxName;
private TextBox textBoxDescription;
private TextBox textBoxPhone;
private DataGridView dataGridView;
private Label labelName;
private Label labelDescription;
private Label labelPhone;
}
}

View File

@ -0,0 +1,165 @@
using NewsBlogAbstractions.Models;
using NewsBlogAbstractions.WorkAbstractions;
using NewsBlogMongoDB.Models;
using NewsBlogMongoDB.StoragesContracts;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace NewsBlogView
{
public partial class FormAuthor : Form
{
private readonly IAuthorWork _authorLogic;
private readonly StorageModel _mongoLogic;
public FormAuthor(IAuthorWork authorLogic, StorageModel mongoLogic)
{
InitializeComponent();
_authorLogic = authorLogic;
_mongoLogic = mongoLogic;
}
private void FormAuthor_Load(object sender, EventArgs e)
{
LoadData();
}
private void ButtonCreate_Click(object sender, EventArgs e)
{
Author newAuthor = new()
{
Name = textBoxName.Text,
Description = textBoxDescription.Text,
Phone = textBoxPhone.Text,
};
if (Program.isPostgreSQL)
_authorLogic.Create(newAuthor);
else
_mongoLogic.AddAuthor(newAuthor);
LoadData();
}
private void LoadData()
{
var authors = _authorLogic.GetAll();
var authorsMongo = _mongoLogic.GetAuthors();
dataGridView.Rows.Clear();
if (dataGridView.ColumnCount == 0)
{
dataGridView.Columns.Add("Id", "ID");
dataGridView.Columns.Add("Name", "Имя");
dataGridView.Columns.Add("Description", "Описание");
dataGridView.Columns.Add("Phone", "Телефон");
}
dataGridView.Columns["Id"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Description"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Phone"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
if (Program.isPostgreSQL)
{
foreach (var author in authors)
{
dataGridView.Rows.Add(author.Id, author.Name, author.Description, author.Phone);
}
}
else
{
foreach (var author in authorsMongo)
{
dataGridView.Rows.Add(author.Id, author.Name, author.Description, author.Phone);
}
}
}
private void ButtonUpdate_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
if (Program.isPostgreSQL)
{
int authorId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
Author updatedAuthor = new()
{
Id = authorId,
Name = textBoxName.Text,
Description = textBoxDescription.Text,
Phone = textBoxPhone.Text,
};
_authorLogic.Update(updatedAuthor);
}
else
{
string? authorId = selectedRow.Cells["Id"].Value.ToString();
AuthorMongo updatedAuthor = new()
{
Id = authorId,
Name = textBoxName.Text,
Description = textBoxDescription.Text,
Phone = textBoxPhone.Text,
};
_mongoLogic.UpdateAuthor(updatedAuthor);
}
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите автора, информацию о котором необходимо обновить");
}
}
private void ButtonDelete_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
if (Program.isPostgreSQL)
{
int authorId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
_authorLogic.Delete(authorId);
}
else
{
string? authorId = selectedRow.Cells["Id"].Value.ToString();
_mongoLogic.DeleteAuthor(authorId);
}
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите автора, информацию о котором необходимо удалить");
}
}
private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = dataGridView.Rows[e.RowIndex];
textBoxName.Text = row.Cells["Name"].Value.ToString();
textBoxDescription.Text = row.Cells["Description"].Value.ToString();
textBoxPhone.Text = row.Cells["Phone"].Value.ToString();
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,129 @@
namespace NewsBlogView
{
partial class FormCategory
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
buttonDelete = new Button();
buttonUpdate = new Button();
buttonCreate = new Button();
textBoxName = new TextBox();
dataGridView = new DataGridView();
labelName = new Label();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// buttonDelete
//
buttonDelete.Location = new Point(741, 292);
buttonDelete.Name = "buttonDelete";
buttonDelete.Size = new Size(128, 30);
buttonDelete.TabIndex = 28;
buttonDelete.Text = "Удалить";
buttonDelete.UseVisualStyleBackColor = true;
buttonDelete.Click += ButtonDelete_Click;
//
// buttonUpdate
//
buttonUpdate.Location = new Point(741, 256);
buttonUpdate.Name = "buttonUpdate";
buttonUpdate.Size = new Size(128, 30);
buttonUpdate.TabIndex = 27;
buttonUpdate.Text = "Изменить";
buttonUpdate.UseVisualStyleBackColor = true;
buttonUpdate.Click += ButtonUpdate_Click;
//
// buttonCreate
//
buttonCreate.Location = new Point(741, 220);
buttonCreate.Name = "buttonCreate";
buttonCreate.Size = new Size(128, 30);
buttonCreate.TabIndex = 26;
buttonCreate.Text = "Добавить";
buttonCreate.UseVisualStyleBackColor = true;
buttonCreate.Click += ButtonCreate_Click;
//
// textBoxName
//
textBoxName.Location = new Point(704, 41);
textBoxName.Name = "textBoxName";
textBoxName.Size = new Size(201, 23);
textBoxName.TabIndex = 21;
//
// dataGridView
//
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.BackgroundColor = SystemColors.Window;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Location = new Point(13, 14);
dataGridView.MultiSelect = false;
dataGridView.Name = "dataGridView";
dataGridView.RowHeadersWidth = 51;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(610, 608);
dataGridView.TabIndex = 15;
dataGridView.CellClick += DataGridView_CellClick;
//
// labelName
//
labelName.AutoSize = true;
labelName.Location = new Point(633, 44);
labelName.Name = "labelName";
labelName.Size = new Size(65, 15);
labelName.TabIndex = 31;
labelName.Text = "Название: ";
//
// FormCategory
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(990, 450);
Controls.Add(textBoxName);
Controls.Add(dataGridView);
Controls.Add(buttonDelete);
Controls.Add(buttonUpdate);
Controls.Add(buttonCreate);
Controls.Add(labelName);
Name = "FormCategory";
Text = "Категории";
Load += FormCategory_Load;
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Button buttonDelete;
private Button buttonUpdate;
private Button buttonCreate;
private TextBox textBoxName;
private DataGridView dataGridView;
private Label labelName;
}
}

View File

@ -0,0 +1,153 @@
using NewsBlogAbstractions.Models;
using NewsBlogAbstractions.WorkAbstractions;
using NewsBlogMongoDB.Models;
using NewsBlogMongoDB.StoragesContracts;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace NewsBlogView
{
public partial class FormCategory : Form
{
private readonly ICategoryWork _categoryLogic;
private readonly StorageModel _mongoLogic;
public FormCategory(ICategoryWork categoryLogic, StorageModel mongoLogic)
{
InitializeComponent();
_categoryLogic = categoryLogic;
_mongoLogic = mongoLogic;
}
private void FormCategory_Load(object sender, EventArgs e)
{
LoadData();
}
private void ButtonCreate_Click(object sender, EventArgs e)
{
Category newCategory = new()
{
Name = textBoxName.Text,
};
if (Program.isPostgreSQL)
_categoryLogic.Create(newCategory);
else
_mongoLogic.AddCategory(newCategory);
LoadData();
}
private void LoadData()
{
var categories = _categoryLogic.GetAll();
var categoriesMongo = _mongoLogic.GetCategorys();
dataGridView.Rows.Clear();
if (dataGridView.ColumnCount == 0)
{
dataGridView.Columns.Add("Id", "ID");
dataGridView.Columns.Add("Name", "Имя");
}
dataGridView.Columns["Id"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
if (Program.isPostgreSQL)
{
foreach (var category in categories)
{
dataGridView.Rows.Add(category.Id, category.Name);
}
}
else
{
foreach (var category in categoriesMongo)
{
dataGridView.Rows.Add(category.Id, category.Name);
}
}
}
private void ButtonUpdate_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
if (Program.isPostgreSQL)
{
int categoryId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
Category updatedCategory = new()
{
Id = categoryId,
Name = textBoxName.Text,
};
_categoryLogic.Update(updatedCategory);
}
else
{
string? categoryId = selectedRow.Cells["Id"].Value.ToString();
CategoryMongo updatedCategory = new()
{
Id = categoryId,
Name = textBoxName.Text,
};
_mongoLogic.UpdateCategory(updatedCategory);
}
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите категорию, информацию о которой необходимо обновить");
}
}
private void ButtonDelete_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
if (Program.isPostgreSQL)
{
int categoryId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
_categoryLogic.Delete(categoryId);
}
else
{
string? categoryId = selectedRow.Cells["Id"].Value.ToString();
_mongoLogic.DeleteCategory(categoryId);
}
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите категорию, информацию о которой необходимо удалить");
}
}
private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = dataGridView.Rows[e.RowIndex];
textBoxName.Text = row.Cells["Name"].Value.ToString();
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,177 @@
using System.Windows.Forms;
namespace NewsBlogView
{
partial class FormComment
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
buttonDelete = new Button();
buttonUpdate = new Button();
buttonCreate = new Button();
textBoxTitle = new TextBox();
textBoxContent = new TextBox();
comboBoxArticle = new ComboBox();
dataGridView = new DataGridView();
labelTitle = new Label();
labelContent = new Label();
labelArticle = new Label();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// buttonDelete
//
buttonDelete.Location = new Point(758, 247);
buttonDelete.Name = "buttonDelete";
buttonDelete.Size = new Size(128, 30);
buttonDelete.TabIndex = 28;
buttonDelete.Text = "Удалить";
buttonDelete.UseVisualStyleBackColor = true;
buttonDelete.Click += ButtonDelete_Click;
//
// buttonUpdate
//
buttonUpdate.Location = new Point(758, 211);
buttonUpdate.Name = "buttonUpdate";
buttonUpdate.Size = new Size(128, 30);
buttonUpdate.TabIndex = 27;
buttonUpdate.Text = "Изменить";
buttonUpdate.UseVisualStyleBackColor = true;
buttonUpdate.Click += ButtonUpdate_Click;
//
// buttonCreate
//
buttonCreate.Location = new Point(758, 175);
buttonCreate.Name = "buttonCreate";
buttonCreate.Size = new Size(128, 30);
buttonCreate.TabIndex = 26;
buttonCreate.Text = "Добавить";
buttonCreate.UseVisualStyleBackColor = true;
buttonCreate.Click += ButtonCreate_Click;
//
// textBoxTitle
//
textBoxTitle.Location = new Point(721, 41);
textBoxTitle.Name = "textBoxTitle";
textBoxTitle.Size = new Size(201, 23);
textBoxTitle.TabIndex = 21;
//
// textBoxContent
//
textBoxContent.Location = new Point(720, 84);
textBoxContent.Name = "textBoxContent";
textBoxContent.Size = new Size(201, 23);
textBoxContent.TabIndex = 32;
//
// comboBoxArticle
//
comboBoxArticle.FormattingEnabled = true;
comboBoxArticle.Location = new Point(720, 131);
comboBoxArticle.Margin = new Padding(3, 4, 3, 4);
comboBoxArticle.Name = "comboBoxArticle";
comboBoxArticle.Size = new Size(201, 23);
comboBoxArticle.TabIndex = 35;
//
// dataGridView
//
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.BackgroundColor = SystemColors.Window;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Location = new Point(13, 14);
dataGridView.MultiSelect = false;
dataGridView.Name = "dataGridView";
dataGridView.RowHeadersWidth = 51;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(610, 608);
dataGridView.TabIndex = 15;
dataGridView.CellClick += DataGridView_CellClick;
//
// labelTitle
//
labelTitle.AutoSize = true;
labelTitle.Location = new Point(633, 44);
labelTitle.Name = "labelTitle";
labelTitle.Size = new Size(71, 15);
labelTitle.TabIndex = 31;
labelTitle.Text = "Заголовок: ";
//
// labelContent
//
labelContent.AutoSize = true;
labelContent.Location = new Point(629, 87);
labelContent.Name = "labelContent";
labelContent.Size = new Size(85, 15);
labelContent.TabIndex = 42;
labelContent.Text = "Содержимое: ";
//
// labelArticle
//
labelArticle.AutoSize = true;
labelArticle.Location = new Point(633, 134);
labelArticle.Name = "labelArticle";
labelArticle.Size = new Size(46, 15);
labelArticle.TabIndex = 44;
labelArticle.Text = "Статья:";
//
// FormComment
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(990, 450);
Controls.Add(labelArticle);
Controls.Add(labelContent);
Controls.Add(labelTitle);
Controls.Add(buttonDelete);
Controls.Add(buttonUpdate);
Controls.Add(buttonCreate);
Controls.Add(textBoxContent);
Controls.Add(textBoxTitle);
Controls.Add(dataGridView);
Controls.Add(comboBoxArticle);
Name = "FormComment";
Text = "Комментарии";
Load += FormComment_Load;
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Button buttonDelete;
private Button buttonUpdate;
private Button buttonCreate;
private TextBox textBoxTitle;
private TextBox textBoxContent;
private ComboBox comboBoxArticle;
private DataGridView dataGridView;
private Label labelTitle;
private Label labelContent;
private Label labelArticle;
}
}

View File

@ -0,0 +1,180 @@
using NewsBlogAbstractions.Models;
using NewsBlogAbstractions.WorkAbstractions;
using NewsBlogMongoDB.Models;
using NewsBlogMongoDB.StoragesContracts;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace NewsBlogView
{
public partial class FormComment : Form
{
private readonly ICommentWork _commentLogic;
private readonly IArticleWork _articleLogic;
private readonly StorageModel _mongoLogic;
public FormComment(ICommentWork commentLogic, IArticleWork articleLogic, StorageModel mongoLogic)
{
InitializeComponent();
_commentLogic = commentLogic;
_articleLogic = articleLogic;
_mongoLogic = mongoLogic;
}
private void FormComment_Load(object sender, EventArgs e)
{
LoadData();
}
private void ButtonCreate_Click(object sender, EventArgs e)
{
Comment newComment = new()
{
Title = textBoxTitle.Text,
Content = textBoxContent.Text,
CreateDate = DateTime.Now,
ArticleId = ((Article?)comboBoxArticle.SelectedItem)?.Id ?? 0,
};
if (Program.isPostgreSQL)
_commentLogic.Create(newComment);
else
_mongoLogic.AddComment(newComment);
LoadData();
}
private void LoadData()
{
dataGridView.Rows.Clear();
if (dataGridView.ColumnCount == 0)
{
dataGridView.Columns.Add("Id", "ID");
dataGridView.Columns.Add("Title", "Заголовок");
dataGridView.Columns.Add("Content", "Содержимое");
dataGridView.Columns.Add("Date", "Дата написания");
dataGridView.Columns.Add("ArticleId", "ArticleId");
dataGridView.Columns["ArticleId"].Visible = false;
dataGridView.Columns.Add("Article", "Статья");
}
dataGridView.Columns["Id"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Title"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Content"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Date"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Article"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
comboBoxArticle.DataSource = _articleLogic.GetAll();
comboBoxArticle.DisplayMember = "Article";
comboBoxArticle.ValueMember = "Title";
if (Program.isPostgreSQL)
{
var comments = _commentLogic.GetAll();
foreach (var comment in comments)
{
dataGridView.Rows.Add(comment.Id, comment.Title, comment.Content, comment.CreateDate.ToString("d"), comment.ArticleId, _articleLogic.Get(comment.ArticleId)?.Title);
}
}
else
{
var comments = _mongoLogic.GetComments();
foreach (var comment in comments)
{
dataGridView.Rows.Add(comment.Id, comment.Title, comment.Content, comment.Create_date, comment.Article_id, _mongoLogic.GetArticleById(comment.Article_id)?.Title);
}
}
}
private void ButtonUpdate_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
if (Program.isPostgreSQL)
{
int commentId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
Comment updatedComment = new()
{
Id = commentId,
Title = textBoxTitle.Text,
Content = textBoxContent.Text,
CreateDate = DateTime.Now,
ArticleId = ((Article?)comboBoxArticle.SelectedItem)?.Id ?? 0,
};
_commentLogic.Update(updatedComment);
}
else
{
string? commentId = selectedRow.Cells["Id"].Value.ToString();
CommentMongo updatedComment = new()
{
Id = commentId,
Title = textBoxTitle.Text,
Content = textBoxContent.Text,
Create_date = DateTime.Now.ToString("d"),
Article_id = _mongoLogic.GetMongoId("Article", ((Article?)comboBoxArticle.SelectedItem)?.Id.ToString() ?? String.Empty),
};
_mongoLogic.UpdateComment(updatedComment);
}
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите комментарий, информацию о котором необходимо обновить");
}
}
private void ButtonDelete_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
if (Program.isPostgreSQL)
{
int commentId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
_commentLogic.Delete(commentId);
}
else
{
string? commentId = selectedRow.Cells["Id"].Value.ToString();
_mongoLogic.DeleteComment(commentId);
}
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите комментарий, информацию о котором необходимо удалить");
}
}
private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = dataGridView.Rows[e.RowIndex];
textBoxTitle.Text = row.Cells["Title"].Value.ToString();
textBoxContent.Text = row.Cells["Content"].Value.ToString();
comboBoxArticle.SelectedValue = row.Cells["Article"].Value;
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

206
NewsBlog/NewsBlogView/FormMain.Designer.cs generated Normal file
View File

@ -0,0 +1,206 @@
namespace NewsBlogView
{
partial class FormMain
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
CheckBox MongoDB;
menuStrip1 = new MenuStrip();
справочникиToolStripMenuItem = new ToolStripMenuItem();
articleToolStripMenuItem = new ToolStripMenuItem();
authorToolStripMenuItem = new ToolStripMenuItem();
categoryToolStripMenuItem = new ToolStripMenuItem();
commentToolStripMenuItem = new ToolStripMenuItem();
tagToolStripMenuItem = new ToolStripMenuItem();
замерВремениToolStripMenuItem = new ToolStripMenuItem();
замерыВремениToolStripMenuItem = new ToolStripMenuItem();
add1000ToolStripMenuItem = new ToolStripMenuItem();
get1000ToolStripMenuItem = new ToolStripMenuItem();
update1000ToolStripMenuItem = new ToolStripMenuItem();
delete1000ToolStripMenuItem = new ToolStripMenuItem();
updateMongoDBToolStripMenuItem = new ToolStripMenuItem();
labelTest = new Label();
MongoDB = new CheckBox();
menuStrip1.SuspendLayout();
SuspendLayout();
//
// menuStrip1
//
menuStrip1.ImageScalingSize = new Size(20, 20);
menuStrip1.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, замерВремениToolStripMenuItem, замерыВремениToolStripMenuItem });
menuStrip1.Location = new Point(0, 0);
menuStrip1.Name = "menuStrip1";
menuStrip1.Size = new Size(554, 24);
menuStrip1.TabIndex = 0;
menuStrip1.Text = "menuStrip1";
//
// справочникиToolStripMenuItem
//
справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { articleToolStripMenuItem, authorToolStripMenuItem, categoryToolStripMenuItem, commentToolStripMenuItem, tagToolStripMenuItem });
справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem";
справочникиToolStripMenuItem.Size = new Size(94, 20);
справочникиToolStripMenuItem.Text = "Справочники";
//
// articleToolStripMenuItem
//
articleToolStripMenuItem.Name = "articleToolStripMenuItem";
articleToolStripMenuItem.Size = new Size(151, 22);
articleToolStripMenuItem.Text = "Статьи";
articleToolStripMenuItem.Click += articleToolStripMenuItem_Click;
//
// authorToolStripMenuItem
//
authorToolStripMenuItem.Name = "authorToolStripMenuItem";
authorToolStripMenuItem.Size = new Size(151, 22);
authorToolStripMenuItem.Text = "Авторы";
authorToolStripMenuItem.Click += authorToolStripMenuItem_Click;
//
// categoryToolStripMenuItem
//
categoryToolStripMenuItem.Name = "categoryToolStripMenuItem";
categoryToolStripMenuItem.Size = new Size(151, 22);
categoryToolStripMenuItem.Text = "Категории";
categoryToolStripMenuItem.Click += categoryToolStripMenuItem_Click;
//
// commentToolStripMenuItem
//
commentToolStripMenuItem.Name = "commentToolStripMenuItem";
commentToolStripMenuItem.Size = new Size(151, 22);
commentToolStripMenuItem.Text = "Комментарии";
commentToolStripMenuItem.Click += commentToolStripMenuItem_Click;
//
// tagToolStripMenuItem
//
tagToolStripMenuItem.Name = "tagToolStripMenuItem";
tagToolStripMenuItem.Size = new Size(151, 22);
tagToolStripMenuItem.Text = "Тэги";
tagToolStripMenuItem.Click += tagToolStripMenuItem_Click;
//
// замерВремениToolStripMenuItem
//
замерВремениToolStripMenuItem.Name = амерВремениToolStripMenuItem";
замерВремениToolStripMenuItem.Size = new Size(12, 20);
//
// замерыВремениToolStripMenuItem
//
замерыВремениToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { add1000ToolStripMenuItem, get1000ToolStripMenuItem, update1000ToolStripMenuItem, delete1000ToolStripMenuItem, updateMongoDBToolStripMenuItem });
замерыВремениToolStripMenuItem.Name = амерыВремениToolStripMenuItem";
замерыВремениToolStripMenuItem.Size = new Size(114, 20);
замерыВремениToolStripMenuItem.Text = "Замеры времени";
//
// add1000ToolStripMenuItem
//
add1000ToolStripMenuItem.Name = "add1000ToolStripMenuItem";
add1000ToolStripMenuItem.Size = new Size(185, 22);
add1000ToolStripMenuItem.Text = "Добавление 1000";
add1000ToolStripMenuItem.Click += add1000ToolStripMenuItem_Click;
//
// get1000ToolStripMenuItem
//
get1000ToolStripMenuItem.Name = "get1000ToolStripMenuItem";
get1000ToolStripMenuItem.Size = new Size(185, 22);
get1000ToolStripMenuItem.Text = "Получение 1000";
get1000ToolStripMenuItem.Click += get1000ToolStripMenuItem_Click;
//
// update1000ToolStripMenuItem
//
update1000ToolStripMenuItem.Name = "update1000ToolStripMenuItem";
update1000ToolStripMenuItem.Size = new Size(185, 22);
update1000ToolStripMenuItem.Text = "Обновление 1000";
update1000ToolStripMenuItem.Click += update1000ToolStripMenuItem_Click;
//
// delete1000ToolStripMenuItem
//
delete1000ToolStripMenuItem.Name = "delete1000ToolStripMenuItem";
delete1000ToolStripMenuItem.Size = new Size(185, 22);
delete1000ToolStripMenuItem.Text = "Удаление 1000";
delete1000ToolStripMenuItem.Click += delete1000ToolStripMenuItem_Click;
//
// updateMongoDBToolStripMenuItem
//
updateMongoDBToolStripMenuItem.Name = "updateMongoDBToolStripMenuItem";
updateMongoDBToolStripMenuItem.Size = new Size(185, 22);
updateMongoDBToolStripMenuItem.Text = "Обновить MongoDB";
updateMongoDBToolStripMenuItem.Click += updateMongoDBToolStripMenuItem_Click;
//
// labelTest
//
labelTest.BorderStyle = BorderStyle.FixedSingle;
labelTest.Location = new Point(156, 82);
labelTest.Name = "labelTest";
labelTest.Size = new Size(250, 100);
labelTest.TabIndex = 3;
labelTest.TextAlign = ContentAlignment.MiddleCenter;
//
// MongoDB
//
MongoDB.AutoSize = true;
MongoDB.Location = new Point(459, 230);
MongoDB.Name = "MongoDB";
MongoDB.Size = new Size(80, 19);
MongoDB.TabIndex = 4;
MongoDB.Text = "MongoDB";
MongoDB.UseVisualStyleBackColor = true;
MongoDB.CheckedChanged += MongoDB_CheckedChanged;
//
// FormMain
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(554, 261);
Controls.Add(MongoDB);
Controls.Add(labelTest);
Controls.Add(menuStrip1);
MainMenuStrip = menuStrip1;
Name = "FormMain";
StartPosition = FormStartPosition.CenterScreen;
Text = "Электронный дневник";
menuStrip1.ResumeLayout(false);
menuStrip1.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
private MenuStrip menuStrip1;
private ToolStripMenuItem справочникиToolStripMenuItem;
private ToolStripMenuItem замерВремениToolStripMenuItem;
private Label labelTest;
private ToolStripMenuItem articleToolStripMenuItem;
private ToolStripMenuItem authorToolStripMenuItem;
private ToolStripMenuItem categoryToolStripMenuItem;
private ToolStripMenuItem commentToolStripMenuItem;
private ToolStripMenuItem tagToolStripMenuItem;
private ToolStripMenuItem замерыВремениToolStripMenuItem;
private ToolStripMenuItem add1000ToolStripMenuItem;
private ToolStripMenuItem get1000ToolStripMenuItem;
private ToolStripMenuItem update1000ToolStripMenuItem;
private ToolStripMenuItem delete1000ToolStripMenuItem;
private ToolStripMenuItem updateMongoDBToolStripMenuItem;
}
}

View File

@ -0,0 +1,204 @@
using NewsBlogAbstractions.Models;
using NewsBlogAbstractions.WorkAbstractions;
using NewsBlogMongoDB;
using System.Security.Policy;
namespace NewsBlogView
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void articleToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormArticle));
if (service is FormArticle form)
{
form.ShowDialog();
}
}
private void authorToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormAuthor));
if (service is FormAuthor form)
{
form.ShowDialog();
}
}
private void categoryToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormCategory));
if (service is FormCategory form)
{
form.ShowDialog();
}
}
private void commentToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormComment));
if (service is FormComment form)
{
form.ShowDialog();
}
}
private void tagToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormTag));
if (service is FormTag form)
{
form.ShowDialog();
}
}
private void add1000ToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(IAuthorWork));
if (service is IAuthorWork authorLogic)
{
DateTime startTime = DateTime.Now;
for (int i = 0; i < 1000; i++)
{
Author author = new()
{
Id = i + 1000,
Name = "ÔÈÎ " + i,
Description = "Îïèñàíèå " + i,
Phone = "Íîìåð " + i
};
authorLogic.CreateId(author);
}
DateTime endTime = DateTime.Now;
labelTest.Text = $"Äîáàâëåíèå 1000 ñòðîê âûïîëíåíî çà {(endTime - startTime).TotalMilliseconds} ìèëëèñåêóíä";
}
}
private void get1000ToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(IAuthorWork));
if (service is IAuthorWork authorLogic)
{
DateTime startTime = DateTime.Now;
for (int i = 0; i < 1000; i++)
authorLogic.Get(i + 1000);
DateTime endTime = DateTime.Now;
labelTest.Text = $"Ïîëó÷åíèå 1000 ñòðîê âûïîëíåíî çà {(endTime - startTime).TotalMilliseconds} ìèëëèñåêóíä";
}
}
private void update1000ToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(IAuthorWork));
if (service is IAuthorWork authorLogic)
{
DateTime startTime = DateTime.Now;
for (int i = 0; i < 1000; i++)
{
Author author = new()
{
Id = i + 1000,
Name = "ÔÈÎ " + i + 2000,
Description = "Îïèñàíèå " + i + 2000,
Phone = "Íîìåð " + i + 2000
};
authorLogic.Update(author);
}
DateTime endTime = DateTime.Now;
labelTest.Text = $"Îáíîâëåíèå 1000 ñòðîê âûïîëíåíî çà {(endTime - startTime).TotalMilliseconds} ìèëëèñåêóíä";
}
}
private void delete1000ToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(IAuthorWork));
if (service is IAuthorWork authorLogic)
{
DateTime startTime = DateTime.Now;
for (int i = 0; i < 1000; i++)
{
authorLogic.Delete(i + 1000);
}
DateTime endTime = DateTime.Now;
labelTest.Text = $"Óäàëåíèå 1000 ñòðîê âûïîëíåíî çà {(endTime - startTime).TotalMilliseconds} ìèëëèñåêóíä";
}
}
private void updateMongoDBToolStripMenuItem_Click(object sender, EventArgs e)
{
ImplementationMongoDB implementationMongoDB = new();
// î÷èùàåì âñ¸
foreach (var it in implementationMongoDB.GetArticles())
implementationMongoDB.DeleteArticle(it.Id);
foreach (var it in implementationMongoDB.GetAuthors())
implementationMongoDB.DeleteAuthor(it.Id);
foreach (var it in implementationMongoDB.GetCategorys())
implementationMongoDB.DeleteCategory(it.Id);
foreach (var it in implementationMongoDB.GetComments())
implementationMongoDB.DeleteComment(it.Id);
foreach (var it in implementationMongoDB.GetTags())
implementationMongoDB.DeleteTag(it.Id);
foreach (var it in implementationMongoDB.GetSequence())
implementationMongoDB.DeleteSequence(it.Id);
// ñêà÷èâàåì èç ïîñòãðåñà
List<Article> listArticle = null;
List<Author> listAuthor = null;
List<Category> listCategory = null;
List<Comment> listComment = null;
List<Tag> listTag = null;
var service = Program.ServiceProvider?.GetService(typeof(IArticleWork));
if (service is IArticleWork articleLogic)
listArticle = articleLogic.GetAll();
service = Program.ServiceProvider?.GetService(typeof(IAuthorWork));
if (service is IAuthorWork authorLogic)
listAuthor = authorLogic.GetAll();
service = Program.ServiceProvider?.GetService(typeof(ICategoryWork));
if (service is ICategoryWork categoryLogic)
listCategory = categoryLogic.GetAll();
service = Program.ServiceProvider?.GetService(typeof(ICommentWork));
if (service is ICommentWork commentLogic)
listComment = commentLogic.GetAll();
service = Program.ServiceProvider?.GetService(typeof(ITagWork));
if (service is ITagWork tagLogic)
listTag = tagLogic.GetAll();
// âëèâàåì äàííûå ìîíãî äá
if (listAuthor != null)
foreach (var it in listAuthor)
implementationMongoDB.AddAuthor(it);
if (listCategory != null)
foreach (var it in listCategory)
implementationMongoDB.AddCategory(it);
if (listArticle != null)
foreach (var it in listArticle)
implementationMongoDB.AddArticle(it);
if (listComment != null)
foreach (var it in listComment)
implementationMongoDB.AddComment(it);
if (listTag != null)
foreach (var it in listTag)
implementationMongoDB.AddTag(it);
}
private void MongoDB_CheckedChanged(object sender, EventArgs e)
{
Program.isPostgreSQL = !Program.isPostgreSQL;
}
}
}

View File

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="MongoDB.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
</root>

177
NewsBlog/NewsBlogView/FormTag.Designer.cs generated Normal file
View File

@ -0,0 +1,177 @@
using System.Windows.Forms;
namespace NewsBlogView
{
partial class FormTag
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
buttonDelete = new Button();
buttonUpdate = new Button();
buttonCreate = new Button();
comboBoxArticle = new ComboBox();
textBoxName = new TextBox();
dataGridView = new DataGridView();
textBoxDescription = new TextBox();
labelName = new Label();
labelDescription = new Label();
labelArticle = new Label();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// buttonDelete
//
buttonDelete.Location = new Point(741, 292);
buttonDelete.Name = "buttonDelete";
buttonDelete.Size = new Size(128, 30);
buttonDelete.TabIndex = 28;
buttonDelete.Text = "Удалить";
buttonDelete.UseVisualStyleBackColor = true;
buttonDelete.Click += ButtonDelete_Click;
//
// buttonUpdate
//
buttonUpdate.Location = new Point(741, 256);
buttonUpdate.Name = "buttonUpdate";
buttonUpdate.Size = new Size(128, 30);
buttonUpdate.TabIndex = 27;
buttonUpdate.Text = "Изменить";
buttonUpdate.UseVisualStyleBackColor = true;
buttonUpdate.Click += ButtonUpdate_Click;
//
// buttonCreate
//
buttonCreate.Location = new Point(741, 220);
buttonCreate.Name = "buttonCreate";
buttonCreate.Size = new Size(128, 30);
buttonCreate.TabIndex = 26;
buttonCreate.Text = "Добавить";
buttonCreate.UseVisualStyleBackColor = true;
buttonCreate.Click += ButtonCreate_Click;
//
// comboBoxArticle
//
comboBoxArticle.FormattingEnabled = true;
comboBoxArticle.Location = new Point(703, 131);
comboBoxArticle.Margin = new Padding(3, 4, 3, 4);
comboBoxArticle.Name = "comboBoxArticle";
comboBoxArticle.Size = new Size(201, 23);
comboBoxArticle.TabIndex = 35;
//
// textBoxName
//
textBoxName.Location = new Point(704, 41);
textBoxName.Name = "textBoxName";
textBoxName.Size = new Size(201, 23);
textBoxName.TabIndex = 21;
//
// dataGridView
//
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.BackgroundColor = SystemColors.Window;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Location = new Point(13, 14);
dataGridView.MultiSelect = false;
dataGridView.Name = "dataGridView";
dataGridView.RowHeadersWidth = 51;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(610, 608);
dataGridView.TabIndex = 15;
dataGridView.CellClick += DataGridView_CellClick;
//
// textBoxDescription
//
textBoxDescription.Location = new Point(703, 84);
textBoxDescription.Name = "textBoxDescription";
textBoxDescription.Size = new Size(201, 23);
textBoxDescription.TabIndex = 32;
//
// labelName
//
labelName.AutoSize = true;
labelName.Location = new Point(633, 44);
labelName.Name = "labelName";
labelName.Size = new Size(65, 15);
labelName.TabIndex = 31;
labelName.Text = "Название: ";
//
// labelDescription
//
labelDescription.AutoSize = true;
labelDescription.Location = new Point(629, 87);
labelDescription.Name = "labelDescription";
labelDescription.Size = new Size(68, 15);
labelDescription.TabIndex = 42;
labelDescription.Text = "Описание: ";
//
// labelArticle
//
labelArticle.AutoSize = true;
labelArticle.Location = new Point(629, 134);
labelArticle.Name = "labelArticle";
labelArticle.Size = new Size(46, 15);
labelArticle.TabIndex = 44;
labelArticle.Text = "Статья:";
//
// FormTag
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(990, 450);
Controls.Add(labelArticle);
Controls.Add(labelDescription);
Controls.Add(labelName);
Controls.Add(textBoxDescription);
Controls.Add(buttonDelete);
Controls.Add(buttonUpdate);
Controls.Add(buttonCreate);
Controls.Add(textBoxName);
Controls.Add(dataGridView);
Controls.Add(comboBoxArticle);
Name = "FormTag";
Text = "Тэги";
Load += FormTag_Load;
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Button buttonDelete;
private Button buttonUpdate;
private Button buttonCreate;
private TextBox textBoxName;
private TextBox textBoxDescription;
private ComboBox comboBoxArticle;
private DataGridView dataGridView;
private Label labelName;
private Label labelDescription;
private Label labelArticle;
}
}

View File

@ -0,0 +1,173 @@
using NewsBlogAbstractions.Models;
using NewsBlogAbstractions.WorkAbstractions;
using NewsBlogMongoDB.Models;
using NewsBlogMongoDB.StoragesContracts;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace NewsBlogView
{
public partial class FormTag : Form
{
private readonly ITagWork _tagLogic;
private readonly IArticleWork _articleLogic;
private readonly StorageModel _mongoLogic;
public FormTag(ITagWork logic, IArticleWork articleLogic, StorageModel mongoLogic)
{
InitializeComponent();
_tagLogic = logic;
_articleLogic = articleLogic;
_mongoLogic = mongoLogic;
}
private void FormTag_Load(object sender, EventArgs e)
{
LoadData();
}
private void ButtonCreate_Click(object sender, EventArgs e)
{
Tag newTag = new()
{
Name = textBoxName.Text,
Description = textBoxDescription.Text,
ArticleId = ((Article?)comboBoxArticle.SelectedItem)?.Id ?? 0,
};
if (Program.isPostgreSQL)
_tagLogic.Create(newTag);
else
_mongoLogic.AddTag(newTag);
LoadData();
}
private void LoadData()
{
dataGridView.Rows.Clear();
if (dataGridView.ColumnCount == 0)
{
dataGridView.Columns.Add("Id", "ID");
dataGridView.Columns.Add("Name", "Имя");
dataGridView.Columns.Add("Description", "Описание");
dataGridView.Columns.Add("ArticleId", "ArticleId");
dataGridView.Columns["ArticleId"].Visible = false;
dataGridView.Columns.Add("Article", "Статья");
}
dataGridView.Columns["Id"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Name"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Description"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Article"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
comboBoxArticle.DataSource = _articleLogic.GetAll();
comboBoxArticle.DisplayMember = "Article";
comboBoxArticle.ValueMember = "Title";
if (Program.isPostgreSQL)
{
var tags = _tagLogic.GetAll();
foreach (var tag in tags)
{
dataGridView.Rows.Add(tag.Id, tag.Name, tag.Description, tag.ArticleId, _articleLogic.Get(tag.ArticleId)?.Title);
}
}
else
{
var tags = _mongoLogic.GetTags();
foreach (var tag in tags)
{
dataGridView.Rows.Add(tag.Id, tag.Name, tag.Decsription, tag.Article_id, _mongoLogic.GetArticleById(tag.Article_id)?.Title);
}
}
}
private void ButtonUpdate_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
if (Program.isPostgreSQL)
{
int tagId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
Tag updatedTag = new()
{
Id = tagId,
Name = textBoxName.Text,
Description = textBoxDescription.Text,
ArticleId = ((Article?)comboBoxArticle.SelectedItem)?.Id ?? 0,
};
_tagLogic.Update(updatedTag);
}
else
{
string? tagId = selectedRow.Cells["Id"].Value.ToString();
TagMongo updatedTag = new()
{
Id = tagId,
Name = textBoxName.Text,
Decsription = textBoxDescription.Text,
Article_id = _mongoLogic.GetMongoId("Article", ((Article?)comboBoxArticle.SelectedItem)?.Id.ToString() ?? String.Empty),
};
_mongoLogic.UpdateTag(updatedTag);
}
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите тэг, информацию о котором необходимо обновить");
}
}
private void ButtonDelete_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count > 0)
{
DataGridViewRow selectedRow = dataGridView.SelectedRows[0];
if (Program.isPostgreSQL)
{
int tagId = Convert.ToInt32(selectedRow.Cells["Id"].Value);
_tagLogic.Delete(tagId);
}
else
{
string? tagId = selectedRow.Cells["Id"].Value.ToString();
_mongoLogic.DeleteTag(tagId);
}
LoadData();
}
else
{
MessageBox.Show("Пожалуйста, выберите тэг, информацию о котором необходимо удалить");
}
}
private void DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = dataGridView.Rows[e.RowIndex];
textBoxName.Text = row.Cells["Name"].Value.ToString();
textBoxDescription.Text = row.Cells["Description"].Value.ToString();
comboBoxArticle.SelectedValue = row.Cells["Article"].Value;
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NewsBlogAbstractions\NewsBlogAbstractions.csproj" />
<ProjectReference Include="..\NewsBlogDatabaseImplementation\NewsBlogDatabaseImplementation.csproj" />
<ProjectReference Include="..\NewsBlogMongoDB\NewsBlogMongoDB.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,49 @@
using Microsoft.Extensions.DependencyInjection;
using NewsBlogAbstractions.WorkAbstractions;
using NewsBlogDatabaseImplementation.WorkImplementation;
using NewsBlogMongoDB.StoragesContracts;
using NewsBlogMongoDB;
namespace NewsBlogView
{
internal static class Program
{
private static ServiceProvider? _serviceProvider;
public static ServiceProvider? ServiceProvider => _serviceProvider;
public static bool isPostgreSQL = true;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
var services = new ServiceCollection();
ConfigureServices(services);
_serviceProvider = services.BuildServiceProvider();
Application.Run(_serviceProvider.GetRequiredService<FormMain>());
}
private static void ConfigureServices(ServiceCollection services)
{
services.AddTransient<IArticleWork, ArticleWork>();
services.AddTransient<IAuthorWork, AuthorWork>();
services.AddTransient<ICategoryWork, CategoryWork>();
services.AddTransient<ICommentWork, CommentWork>();
services.AddTransient<ITagWork, TagWork>();
services.AddTransient<StorageModel, ImplementationMongoDB>();
services.AddTransient<FormMain>();
services.AddTransient<FormArticle>();
services.AddTransient<FormAuthor>();
services.AddTransient<FormCategory>();
services.AddTransient<FormComment>();
services.AddTransient<FormTag>();
}
}
}