Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions silvermax.FlashCards/Controllers/DatabaseController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
using Microsoft.Data.SqlClient;
using Dapper;

namespace silvermax.FlashCards.Controllers;

internal class DatabaseController
{
private readonly DbConfig dbConfig = new();
public void InitTables()
{
using (var masterCon = new SqlConnection(dbConfig.MasterConnectionString))
{
masterCon.Open();

masterCon.Execute("IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'flashcardDB') CREATE DATABASE flashcardDB");
}

using (var connection = new SqlConnection(dbConfig.ConnectionString))
{
connection.Open();

string createStackTableSql = @"
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Stacks')
BEGIN
CREATE TABLE Stacks (
Id INT PRIMARY KEY IDENTITY(1,1),
StackName NVARCHAR(50) NOT NULL
)
END";

string createCardTableSql = @"
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Flashcards')
BEGIN
CREATE TABLE Flashcards (
Id INT PRIMARY KEY IDENTITY(1,1),
StackId INT NOT NULL,
Word NVARCHAR(50),
Translation NVARCHAR(50)
CONSTRAINT FK_Flashcards_Stacks FOREIGN KEY (StackId)
REFERENCES Stacks(Id) ON DELETE CASCADE
)
END";

string createSessionTableSql = @"
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Sessions')
BEGIN
CREATE TABLE Sessions (
Id INT PRIMARY KEY IDENTITY(1,1),
Date DATETIME2 NOT NULL,
Score INT NOT NULL
)
END";
connection.Execute(createStackTableSql);
connection.Execute(createCardTableSql);
connection.Execute(createSessionTableSql);
}
}
}
157 changes: 157 additions & 0 deletions silvermax.FlashCards/Controllers/FlashCardController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
using Dapper;
using Microsoft.Data.SqlClient;
using silvermax.FlashCards.DtOs;
using silvermax.FlashCards.Models;
using Spectre.Console;
using static silvermax.FlashCards.Enums;

namespace silvermax.FlashCards.Controllers;

internal class FlashCardController
{
private readonly DatabaseHelper db = new();
StacksController controller = new();
UserInput input = new();
public void Start()
{
var choice = AnsiConsole.Prompt(
new SelectionPrompt<ManageFlashCard>()
.Title("Choose an action to do on flashcards")
.UseConverter(e => Enums.ToDisplayName(e))
.AddChoices(Enum.GetValues<ManageFlashCard>()));

switch (choice)
{
case ManageFlashCard.AddFlashcard:
AddFlashCard();
break;

case ManageFlashCard.EditFlashcard:
EditFlashCard();
break;

case ManageFlashCard.DeleteFlashcard:
DeleteFlashCard();
break;

case ManageFlashCard.ViewAllFlashcards:
ViewAllFlashCards();
break;

case ManageFlashCard.Back:
return;
}
}

private void ViewAllFlashCards()
{
using (var connection = db.GetConnection())
{

var cards = connection.Query<FlashCardResponseDto>("SELECT * FROM Flashcards").ToList();

AnsiConsole.Write(UIHelper.BuildFlashCardTable(cards));
}

AnsiConsole.MarkupLine("Press Any Key to continue...");
Console.ReadKey();
}

private void DeleteFlashCard()
{
var word = AnsiConsole.Ask<string>("Please enter the word of the FlashCard you want to delete: ");

if (!db.FlashCardExists(word))
{
AnsiConsole.MarkupLine($"[red]FlashCard with word {word} does not exist.[/]");
UIHelper.PressAnyKey();
return;
}

using (var connection = db.GetConnection())
{
connection.Execute("DELETE FROM Flashcards WHERE Word = @Word", new { Word = word });

AnsiConsole.MarkupLine($"[green]Flashcard with word {word} deleted successfully[/]");
}

UIHelper.PressAnyKey();
}

private void EditFlashCard()
{
var wordToChange = AnsiConsole.Ask<string>("Please enter the word of the FlashCard you want to delete: ");
var (word, translation) = input.GetUserInput();

if (!db.FlashCardExists(wordToChange))
{
AnsiConsole.MarkupLine($"[red]FlashCard with word {wordToChange} does not exist.[/]");
UIHelper.PressAnyKey();
return;
}

using (var connection = db.GetConnection())
{

string updatesql = "UPDATE Flashcards SET Word = @NewWord, Translation = @Translation WHERE Word = @Word";

var cardToUpdate = new
{
NewWord = wordToChange,
Word = word,
Translation = translation,
};

connection.Execute(updatesql, cardToUpdate);

AnsiConsole.MarkupLine($"[green]FlashCard with word {word} updated successfully[/]");
}

UIHelper.PressAnyKey();
}

private void AddFlashCard()
{
var (word, translation) = input.GetUserInput();
controller.GetAllStacks();
var stackName = AnsiConsole.Ask<string>("Please enter the Id of the Stack that this flashcard will be added to: ");

using (var connection = db.GetConnection())
{
var stackId = db.GetStackId(stackName);

if (!db.StackExists(stackId))
{
AnsiConsole.MarkupLine($"[red]Stack {stackName} does not exist.[/].");
UIHelper.PressAnyKey();
return;
}

string insertSql = """
IF NOT EXISTS (SELECT 1 FROM Flashcards WHERE StackId = @StackId AND Word = @Word)
INSERT INTO Flashcards (StackId, Word, Translation) VALUES (@StackId, @Word, @Translation)
""";

var entry = new FlashCard
{
StackId = stackId,
Word = word,
Translation = translation
};

int rowsAffected = connection.Execute(insertSql, entry);

if (rowsAffected <= 0)
{
AnsiConsole.MarkupLine($"[red]'{word}' already exists in the database[/]");
}
else
{
AnsiConsole.MarkupLine($"[green]Flashcard added sucessfully to the database[/]");
}
}

AnsiConsole.MarkupLine("Press Any Key to continue...");
Console.ReadKey();
}
}
Loading