# Реалізація інформаційного та програмного забезпечення

В рамках проекту розробляється:

  • SQL-скрипт для створення на початкового наповнення бази даних
  • RESTfull сервіс для управління даними

# Реалізація інформаційного та програмного забезпечення

В рамках проекту розробляється:

  • SQL-скрипт для створення на початкового наповнення бази даних
  • RESTfull сервіс для управління даними

-- MySQL Script generated by MySQL Workbench -- Sun Dec 25 07:19:21 2022 -- Model: New Model Version: 1.0 -- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';


-- Schema mydb


DROP SCHEMA IF EXISTS mydb ;


-- Schema mydb


CREATE SCHEMA IF NOT EXISTS mydb DEFAULT CHARACTER SET utf8 ; USE mydb ;


-- Table mydb.answer


DROP TABLE IF EXISTS mydb.answer ;

CREATE TABLE IF NOT EXISTS mydb.answer ( user_id INT NOT NULL, text TEXT NOT NULL, data DATE NOT NULL, id INT NOT NULL AUTO_INCREMENT, answer_id INT NOT NULL, PRIMARY KEY (id), INDEX fk_selectedOption_id_idx (answer_id ASC) VISIBLE, INDEX fk_user_id_idx (user_id ASC) VISIBLE, CONSTRAINT fk_selectedOption_id FOREIGN KEY (answer_id) REFERENCES mydb.selectedOption (id) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES mydb.user (id) ON DELETE NO ACTION ON UPDATE NO ACTION);


-- Table mydb.category


DROP TABLE IF EXISTS mydb.category ;

CREATE TABLE IF NOT EXISTS mydb.category ( category_id INT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY (category_id));


-- Table mydb.option


DROP TABLE IF EXISTS mydb.option ;

CREATE TABLE IF NOT EXISTS mydb.option ( type TEXT(255) NOT NULL, text TEXT(255) NOT NULL, id INT NOT NULL AUTO_INCREMENT, question_id INT NOT NULL, PRIMARY KEY (id), INDEX fk_question_id_idx (question_id ASC) VISIBLE, CONSTRAINT fk_question_id FOREIGN KEY (question_id) REFERENCES mydb.question (id) ON DELETE NO ACTION ON UPDATE NO ACTION);


-- Table mydb.question


DROP TABLE IF EXISTS mydb.question ;

CREATE TABLE IF NOT EXISTS mydb.question ( type TEXT(255) NOT NULL, text TEXT(255) NOT NULL, id INT NOT NULL AUTO_INCREMENT, topic TEXT(255) NOT NULL, quiz_id INT NOT NULL, PRIMARY KEY (id), INDEX fk_quiz_id_idx (quiz_id ASC) VISIBLE, CONSTRAINT fk_quiz_id FOREIGN KEY (quiz_id) REFERENCES mydb.quiz (id) ON DELETE NO ACTION ON UPDATE NO ACTION);


-- Table mydb.quiz


DROP TABLE IF EXISTS mydb.quiz ;

CREATE TABLE IF NOT EXISTS mydb.quiz ( type TEXT(255) NOT NULL, text TEXT(255) NOT NULL, id INT NOT NULL AUTO_INCREMENT, topic TEXT(255) NOT NULL, date DATETIME NOT NULL, creator_id INT NOT NULL, PRIMARY KEY (id), INDEX fk_creator_id_idx (creator_id ASC) VISIBLE, CONSTRAINT fk_creator_id FOREIGN KEY (creator_id) REFERENCES mydb.user (id) ON DELETE NO ACTION ON UPDATE NO ACTION);


-- Table mydb.selectedOption


DROP TABLE IF EXISTS mydb.selectedOption ;

CREATE TABLE IF NOT EXISTS mydb.selectedOption ( id INT NOT NULL AUTO_INCREMENT, option_id INT NOT NULL, PRIMARY KEY (id), INDEX fk_option_id_idx (option_id ASC) VISIBLE, CONSTRAINT fk_option_id FOREIGN KEY (option_id) REFERENCES mydb.option (id) ON DELETE NO ACTION ON UPDATE NO ACTION);


-- Table mydb.user


DROP TABLE IF EXISTS mydb.user ;

CREATE TABLE IF NOT EXISTS mydb.user ( username VARCHAR(16) NOT NULL, mail VARCHAR(255) NOT NULL, id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id));

SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

# Реалізація доступу до бази даних

# Файл ApplicationDbContext.cs

using Microsoft.EntityFrameworkCore;
using WebAPI.Models;

namespace WebAPI;

public class ApplicationDbContext : DbContext
{
    public DbSet<User> Users { get; set; }

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> dbContext) : base(dbContext)
    {
    }
}

# Файл UserRepository.cs

using Microsoft.EntityFrameworkCore;
using WebAPI.Interfaces;
using WebAPI.Models;

namespace WebAPI.Repositories;

public class UserRepository : IUserRepository
{
    private readonly ApplicationDbContext _dbContext;

    public UserRepository(ApplicationDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public IQueryable<User> GetAllUsers()
    {
        return _dbContext.Users;
    }

    public User GetUserById(int id)
    {
        return _dbContext.Users.FirstOrDefault(user => user.Id == id);
    }

    public void AddUser(User user)
    {
        _dbContext.Users.Add(user);
    }

    public void UpdateUser(User user)
    {
        _dbContext.Users.Update(user);
    }

    public void DeleteUser(User user)
    {
        _dbContext.Users.Remove(user);
    }

    public int SaveChanges()
    {
        return _dbContext.SaveChanges();
    }
}

# Файл UserService.cs

using WebAPI.Interfaces;
using WebAPI.Models;

namespace WebAPI.Services;

public class UserService : IUserService
{
    private readonly IUserRepository _userRepository;

    public UserService(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public IQueryable<User> GetAllUsers()
    {
        return _userRepository.GetAllUsers();
    }

    public User GetUserById(int id)
    {
        return _userRepository.GetUserById(id);
    }

    public void AddUser(User user)
    {
        _userRepository.AddUser(user);
    }

    public void UpdateUser(User user)
    {
        _userRepository.UpdateUser(user);
    }

    public void DeleteUser(User user)
    {
        _userRepository.DeleteUser(user);
    }

    public int SaveChanges()
    {
        return _userRepository.SaveChanges();
    }
}

# Файл UserController.cs

using Microsoft.AspNetCore.Mvc;
using WebAPI.Interfaces;
using WebAPI.Models;

namespace WebAPI.Controllers;

[ApiController]
[Route("api/[controller]")]
public class UserController : ControllerBase
{
    private readonly IUserService _userService;

    public UserController(IUserService userService)
    {
        _userService = userService;
    }

    [HttpGet]
    [Route("[action]")]
    public ActionResult<IEnumerable<User>> GetAll()
    {
        IEnumerable<User> users = _userService.GetAllUsers();
        if (users is null) return NotFound("Users not found");
        return Ok(users);
    }

    [HttpGet("{id}")]
    public ActionResult<User> Get(int id)
    {
        User user = _userService.GetUserById(id);
        if (user is null) return NotFound("User not found.");
        return Ok(user);
    }

    [HttpDelete]
    public ActionResult Delete(User user)
    {
        try
        {
            _userService.DeleteUser(user);
            _userService.SaveChanges();
        }
        catch (Exception)
        {
            return BadRequest("Bad request.");
        }
        
        return Ok("User was deleted.");
    }

    [HttpPost]
    public ActionResult Post(User user)
    {
        try
        {
            _userService.AddUser(user);
            _userService.SaveChanges();
        }
        catch (Exception)
        {
            return BadRequest("Bad request.");
        }

        return Ok("User was added.");
    }
    
    [HttpPut]
    public ActionResult Put(User user)
    {
        try
        {
            _userService.UpdateUser(user);
            _userService.SaveChanges();
        }
        catch (Exception)
        {
            return BadRequest("Bad request.");
        }

        return Ok("User was updated.");
    }
}

# Файл Program.cs

using Microsoft.EntityFrameworkCore;
using WebAPI;
using WebAPI.Interfaces;
using WebAPI.Repositories;
using WebAPI.Services;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

builder.Services.AddDbContext<ApplicationDbContext>(options =>
{
    string connectionString = builder.Configuration.GetConnectionString("DatabaseCS");
    MySqlServerVersion serverVersion = new MySqlServerVersion(new Version(5, 7, 32));
    options.UseMySql(connectionString, serverVersion);
});

builder.Services.AddScoped<IUserRepository, UserRepository>();
builder.Services.AddScoped<IUserService, UserService>();

builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();

    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseStatusCodePages();
app.MapDefaultControllerRoute();

app.Run();
Останнє оновлення: 1/6/2023, 4:03:13 PM