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
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,5 @@ _UpgradeReport_Files/

Thumbs.db
Desktop.ini
.DS_Store
.DS_Store
.fake
33 changes: 19 additions & 14 deletions Okane.Application/CreateExpenseRequest.cs
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
using System;
using System.ComponentModel.DataAnnotations;

namespace Okane.Application;

public class CreateExpenseRequest
namespace Okane.Application
{
[Required]
[Range(1, 1_000_000, ErrorMessage = "Amount is out of range")]
public int Amount { get; set; }

[Required]
[MaxLength(80, ErrorMessage = "Category is too long")]
public required string Category { get; set; }

[MaxLength(250, ErrorMessage = "Description is too long")]
public string? Description { get; set; }
}
public class CreateExpenseRequest
{
[Required]
[Range(1, 1_000_000, ErrorMessage = "Amount is out of range")]
public int Amount { get; set; }

[Required]
[MaxLength(80, ErrorMessage = "Category is too long")]
public string Category { get; set; }

[MaxLength(250, ErrorMessage = "Description is too long")]
public string? Description { get; set; }

[Required]
public DateTime DateCreated { get; set; } // Nueva propiedad para la fecha
}
}
40 changes: 24 additions & 16 deletions Okane.Application/DataAnnotationsValidator.cs
Original file line number Diff line number Diff line change
@@ -1,25 +1,33 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;

namespace Okane.Application;

public class DataAnnotationsValidator<T>
namespace Okane.Application
{
public IDictionary<string, string[]> Validate(T obj)
public class DataAnnotationsValidator<T>
{
var results = new List<ValidationResult>();
public IDictionary<string, string[]> Validate(T obj)
{
if (obj == null)
{
throw new ArgumentNullException(nameof(obj));
}

var results = new List<ValidationResult>();
var context = new ValidationContext(
obj, serviceProvider: null, items: null);

var context = new ValidationContext(
obj, serviceProvider: null, items: null);
Validator.TryValidateObject(obj, context, results, validateAllProperties: true);

Validator.TryValidateObject(obj, context, results, validateAllProperties: true);
return results
.GroupBy(result => string.Join('+', result.MemberNames))
.ToDictionary(
grouping => grouping.Key,
ToArray);
}

return results
.GroupBy(result => string.Join('+', result.MemberNames))
.ToDictionary(
grouping => grouping.Key,
ToArray);
private static string[] ToArray(IGrouping<string, ValidationResult> grouping) =>
grouping.Select(result => result.ErrorMessage ?? string.Empty).ToArray();
}

private static string[] ToArray(IGrouping<string, ValidationResult> grouping) =>
grouping.Select(result => result.ErrorMessage ?? string.Empty).ToArray();
}
1 change: 1 addition & 0 deletions Okane.Application/ExpenseResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ public class ExpenseResponse
public int Amount { get; set; }
public required string Category { get; set; }
public string? Description { get; set; }
public DateTime DateCreated { get; set; }
}
105 changes: 65 additions & 40 deletions Okane.Application/ExpenseService.cs
Original file line number Diff line number Diff line change
@@ -1,57 +1,82 @@
using Okane.Domain;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Okane.Application;

public class ExpenseService : IExpenseService
namespace Okane.Application
{
private readonly IExpensesRepository _expensesRepository;
public class ExpenseService : IExpenseService
{
private readonly IExpensesRepository _expensesRepository;

public ExpenseService(IExpensesRepository expensesRepository) =>
_expensesRepository = expensesRepository;
public ExpenseService(IExpensesRepository expensesRepository) =>
_expensesRepository = expensesRepository;

public ExpenseResponse RegisterExpense(CreateExpenseRequest request)
{
var expense = new Expense
public ExpenseResponse RegisterExpense(CreateExpenseRequest request)
{
Amount = request.Amount,
Description = request.Description,
Category = request.Category
};
var expense = new Expense
{
Amount = request.Amount,
Description = request.Description,
Category = request.Category,
DateCreated = DateTime.UtcNow // Incluir la fecha actual al registrar
};

_expensesRepository.Add(expense);
_expensesRepository.Add(expense);

return CreateExpenseResponse(expense);
}
return CreateExpenseResponse(expense);
}

public ExpenseResponse? ById(int id)
{
var expense = _expensesRepository.ById(id);
public ExpenseResponse? ById(int id)
{
var expense = _expensesRepository.ById(id);

return expense == null ? null : CreateExpenseResponse(expense);
}
return expense == null ? null : CreateExpenseResponse(expense);
}

public IEnumerable<ExpenseResponse> Search(string? category = null) =>
_expensesRepository
.Search(category)
.Select(CreateExpenseResponse);
public IEnumerable<ExpenseResponse> Search(string? category = null) =>
_expensesRepository
.Search(category)
.Select(CreateExpenseResponse);

public bool Delete(int id)
{
var expenseToDelete = _expensesRepository.ById(id);
public bool Delete(int id)
{
var expenseToDelete = _expensesRepository.ById(id);

if (expenseToDelete == null)
return false;
if (expenseToDelete == null)
return false;

_expensesRepository.Delete(id);
return true;
}
_expensesRepository.Delete(id);
return true;
}

private static ExpenseResponse CreateExpenseResponse(Expense expense) =>
new()
public ExpenseResponse? UpdateExpense(int id, UpdateExpenseRequest request)
{
Id = expense.Id,
Category = expense.Category,
Description = expense.Description,
Amount = expense.Amount
};
}
var existingExpense = _expensesRepository.ById(id);
if (existingExpense == null)
return null; // No se encontró el gasto para actualizar

// Actualizar la información del gasto
existingExpense.Amount = request.Amount;
existingExpense.Category = request.Category;
existingExpense.Description = request.Description;

// Guardar los cambios
_expensesRepository.Update(existingExpense);

// Devolver la respuesta actualizada
return CreateExpenseResponse(existingExpense);
}

private static ExpenseResponse CreateExpenseResponse(Expense expense) =>
new()
{
Id = expense.Id,
Category = expense.Category,
Description = expense.Description,
Amount = expense.Amount,
DateCreated = expense.DateCreated // Asegúrate de incluir la fecha al crear la respuesta
};
}
}
36 changes: 28 additions & 8 deletions Okane.Application/IExpenseService.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,29 @@
namespace Okane.Application;

public interface IExpenseService
using Okane.Application;
namespace Okane.Application
{
ExpenseResponse RegisterExpense(CreateExpenseRequest request);
ExpenseResponse? ById(int id);
IEnumerable<ExpenseResponse> Search(string? category = null);
bool Delete(int id);
}
public interface IExpenseService
{
ExpenseResponse RegisterExpense(CreateExpenseRequest request);
ExpenseResponse? ById(int id);
IEnumerable<ExpenseResponse> Search(string? category = null);
bool Delete(int id);
ExpenseResponse? UpdateExpense(int id, UpdateExpenseRequest request);

}

public class UpdateExpenseRequest

{
[Required]
[Range(1, 1_000_000, ErrorMessage = "Amount is out of range")]
public int Amount { get; set; }

[Required]
[MaxLength(80, ErrorMessage = "Category is too long")]
public string Category { get; set; }

[MaxLength(250, ErrorMessage = "Description is too long")]
public string? Description { get; set; }
}
}

1 change: 1 addition & 0 deletions Okane.Application/IExpensesRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ public interface IExpensesRepository
IEnumerable<Expense> Search(string? categoryName = null);
void Delete(int id);
Expense? ById(int id);
void Update(Expense existingExpense);
}
1 change: 1 addition & 0 deletions Okane.Domain/Expense.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ public class Expense
public int Amount { get; set; }
public required string Category { get; set; }
public string? Description { get; set; }
public DateTime DateCreated { get; set; }
}