Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
d8a19d9
Main Menu interface completed
davetn657 Feb 2, 2026
5d37e27
Created new Option Utility to return all Description Values of an Enu…
davetn657 Feb 6, 2026
218fcb5
working stack creation and viewing functionality
davetn657 Feb 9, 2026
f1b0443
New title panel UI and choose stack UI
davetn657 Feb 9, 2026
40160cf
Added validation to stack name creation, changed datatype of readalls…
davetn657 Feb 9, 2026
97e6413
working deletion of stack (need to add deletion of related cards)
davetn657 Feb 9, 2026
20ca38e
working create card UI
davetn657 Feb 10, 2026
c7dee06
working card creation
davetn657 Feb 10, 2026
ba564fc
working stack editing and changed method name and function to reduce …
davetn657 Feb 10, 2026
2ecc354
Added return option to UIs and handled user inputing specified menu o…
davetn657 Feb 10, 2026
b503af5
working EditCard UI and changed UI to force user to return when delet…
davetn657 Feb 10, 2026
cf95b37
working Edit card method
davetn657 Feb 10, 2026
e395a68
added ability for user to return on textprompts
davetn657 Feb 11, 2026
d0245c1
Updated SQL queries
davetn657 Feb 11, 2026
e26ff8f
Updated SQL queries
davetn657 Feb 11, 2026
e1dd251
Added base study session controller functions and removing of all car…
davetn657 Feb 14, 2026
4a03e22
created overload methods for deleting sessions and cards when a stack…
davetn657 Feb 17, 2026
604a9bf
Organized UserInterface into 4 main views
davetn657 Feb 20, 2026
a55e2a2
Added flashcard display and functionality for study sessions, added p…
davetn657 Feb 25, 2026
e110ba2
README.md
davetn657 Feb 25, 2026
02f6956
Codaccy fixes
davetn657 Feb 25, 2026
7010bb0
More Codacy fixes
davetn657 Feb 25, 2026
45581ca
Added Sql script
davetn657 Mar 1, 2026
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
197 changes: 197 additions & 0 deletions Flashcards.davetn657/Controllers/CardController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
using Flashcards.davetn657.Models;
using Flashcards.davetn657.Models.DTOs;
using Flashcards.davetn657.Models.Enums;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
using System.Data;

namespace Flashcards.davetn657.Controllers;

public class CardController
{
private IConfiguration configuration;
private string? connectionString;

public CardController()
{
this.configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
this.connectionString = configuration.GetConnectionString("DatabaseConnection");
}

internal void AddCard(CardDto card, StackDto stack)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();

var tableCmd = connection.CreateCommand();
tableCmd.CommandText = @"INSERT INTO CARDS (StackId, CardQuestion, CardAnswer)
VALUES (@StackId, @Question, @Answer)";

tableCmd.Parameters.Add("@StackId", SqlDbType.Int).Value = stack.Id;
tableCmd.Parameters.Add("@Question", SqlDbType.Text).Value = card.Question;
tableCmd.Parameters.Add("@Answer", SqlDbType.Text).Value = card.Answer;

tableCmd.ExecuteNonQuery();

connection.Close();
}
}

internal void RemoveCard(CardDto card)
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();

var tableCmd = connection.CreateCommand();
tableCmd.CommandText = @"DELETE FROM CARDS
WHERE CardId = @Id";

tableCmd.Parameters.Add("@Id", SqlDbType.Int).Value = card.Id;

tableCmd.ExecuteNonQuery();

connection.Close();
}

}

internal void RemoveCard(StackDto stack)
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();

var tableCmd = connection.CreateCommand();
tableCmd.CommandText = @"DELETE FROM CARDS
WHERE StackId = @Id";

tableCmd.Parameters.Add("@Id", SqlDbType.Int).Value = stack.Id;

tableCmd.ExecuteNonQuery();

connection.Close();
}

}

internal void EditCard(CardDto card, Enum option)
{
using(var connection = new SqlConnection(connectionString))
{
connection.Open();

var tableCmd = connection.CreateCommand();

if (option.Equals(EditCardOptions.ChangeAnswer))
{
tableCmd.CommandText = @"UPDATE CARDS
SET CardAnswer = @Answer
WHERE CardId = @id";
tableCmd.Parameters.Add("@Answer", SqlDbType.Text).Value = card.Answer;
}
else if(option.Equals(EditCardOptions.ChangeQuestion))
{
tableCmd.CommandText = @"UPDATE CARDS
SET CardQuestion = @Question
WHERE CardId = @id";
tableCmd.Parameters.Add("@Question", SqlDbType.Text).Value = card.Question;
}

tableCmd.Parameters.Add("@Id", SqlDbType.Int).Value = card.Id;
tableCmd.ExecuteNonQuery();

connection.Close();
}
}

internal void ChangeTime(CardDto card, DateTime timeChange)
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();

var tableCmd = connection.CreateCommand();
tableCmd.CommandText = @"UPDATE CARDS
SET LastAppearance = @today,
NextAppearance = @time
WHERE CardId = @id";

tableCmd.Parameters.Add("@today", SqlDbType.DateTime).Value = DateTime.Now;
tableCmd.Parameters.Add("@time", SqlDbType.DateTime).Value = timeChange;
tableCmd.Parameters.Add("@id", SqlDbType.Int).Value = card.Id;

tableCmd.ExecuteNonQuery();

connection.Close();
}
}

internal Dictionary<string, CardDto> ReadAllCards()
{
var allCards = new Dictionary<string, CardDto>();

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

var tabldCmd = connection.CreateCommand();
tabldCmd.CommandText = @"SELECT * FROM CARDS";

var reader = tabldCmd.ExecuteReader();

while (reader.Read())
{
var card = new CardDto();
card.Id = reader.GetInt32("CardId");
card.Question = reader.GetString("CardQuestion");
card.Answer = reader.GetString("CardAnswer");
card.LastAppearance = reader.GetDateTime("LastAppearance");
card.NextAppearance = reader.GetDateTime("NextAppearance");
allCards.Add(card.Question, card);
}

connection.Close();
}

return allCards;
}

internal Dictionary<string, CardDto> ReadAllCards(StudyDto session)
{
var allCards = new Dictionary<string, CardDto>();

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

var tableCmd = connection.CreateCommand();
tableCmd.CommandText = @"SELECT * FROM CARDS
WHERE StackId = @id
ORDER BY NextAppearance DESC";

tableCmd.Parameters.Add("@Id", SqlDbType.Int).Value = session.StackId;

var reader = tableCmd.ExecuteReader();

while (reader.Read())
{
var card = new CardDto();
card.Id = reader.GetInt32("CardId");
card.Question = reader.GetString("CardQuestion");
card.Answer = reader.GetString("CardAnswer");
card.LastAppearance = reader.GetDateTime("LastAppearance");
card.NextAppearance = reader.GetDateTime("NextAppearance");
allCards.Add(card.Question, card);
}

connection.Close();
}

return allCards;
}
}
77 changes: 77 additions & 0 deletions Flashcards.davetn657/Controllers/ScoreController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
using Flashcards.davetn657.Models.DTOs;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
using System.Data;

namespace Flashcards.davetn657.Controllers;

public class ScoreController
{
private IConfiguration configuration;
private string? connectionString;

public ScoreController()
{
this.configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
this.connectionString = configuration.GetConnectionString("DatabaseConnection");
}

internal void AddScore(StudyDto session, ScoreDto score)
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();

var tableCmd = connection.CreateCommand();
tableCmd.CommandText = @"INSERT INTO SCORES (SessionId, Score)
VALUES (@id, @score)";

tableCmd.Parameters.Add("@id", SqlDbType.Int).Value = session.Id;
tableCmd.Parameters.Add("@score", SqlDbType.Int).Value = score.Score;

tableCmd.ExecuteNonQuery();

connection.Close();
}
}

internal List<ScoreDto> GetScores(int numberOfDays)
{
var pastScores = new List<ScoreDto>();

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

var tableCmd = connection.CreateCommand();
tableCmd.CommandText = @"SELECT Sessions.StackId, Sessions.SessionName, Scores.Score, Scores.CreateDate
FROM Sessions
LEFT JOIN Scores ON Sessions.SessionId = Scores.SessionId
WHERE CAST(Scores.CreateDate AS DATE) >= DATEADD(day, @numDays, GETDATE())
GROUP BY Sessions.StackId, Sessions.SessionName, Scores.Score, Scores.CreateDate
ORDER BY Scores.CreateDate DESC";

tableCmd.Parameters.Add("@numDays", SqlDbType.Int).Value = -numberOfDays;

var reader = tableCmd.ExecuteReader();

while (reader.Read())
{
var data = new ScoreDto();
data.SessionId = reader.GetInt32("StackId");
data.Name = reader.GetString("SessionName");
data.Score = reader.GetInt32("Score");
data.CreateDate = reader.GetDateTime("CreateDate");

pastScores.Add(data);
}

connection.Close();
}

return pastScores;
}
}
Loading