Todo repository protocol #8
@@ -1,8 +1,12 @@
|
|||||||
import SwiftData
|
import SwiftData
|
||||||
|
|
||||||
/// Extends ModelContext to conform to the Repository protocol.
|
/// Extends ModelContext to conform to the TodoRepository protocol.
|
||||||
///
|
///
|
||||||
/// This extension allows ModelContext from SwiftData to be used as a repository,
|
/// This extension allows ModelContext from SwiftData to be used as a todo repository,
|
||||||
/// enabling dependency injection and facilitating unit testing by allowing mock
|
/// enabling dependency injection and facilitating unit testing by allowing mock
|
||||||
/// repositories to be substituted during tests.
|
/// repositories to be substituted during tests.
|
||||||
extension ModelContext: Repository {}
|
///
|
||||||
|
/// The ModelContext methods `delete(_:)` and `insert(_:)` already match the
|
||||||
|
/// TodoRepository protocol requirements, so this extension simply declares conformance
|
||||||
|
/// without requiring additional implementation.
|
||||||
|
extension ModelContext: TodoRepository {}
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
import SwiftData
|
|
||||||
|
|
||||||
/// A protocol defining the interface for a data repository.
|
|
||||||
///
|
|
||||||
/// This protocol abstracts the underlying data persistence mechanism, allowing for
|
|
||||||
/// dependency injection and easier testing. Implementations handle the storage and
|
|
||||||
/// retrieval of model objects.
|
|
||||||
protocol Repository {
|
|
||||||
|
|
||||||
/// Deletes a model object from the repository.
|
|
||||||
///
|
|
||||||
/// This method removes the specified object from persistent storage. The deletion
|
|
||||||
/// is typically performed immediately, though the actual persistence may be deferred
|
|
||||||
/// until a save operation occurs depending on the implementation.
|
|
||||||
///
|
|
||||||
/// - Parameter model: The model object to delete from the repository.
|
|
||||||
func delete(_ model: some PersistentModel)
|
|
||||||
|
|
||||||
/// Inserts a new model object into the repository.
|
|
||||||
///
|
|
||||||
/// This method adds a new object to persistent storage. The object is typically
|
|
||||||
/// tracked immediately, though the actual persistence may be deferred until a
|
|
||||||
/// save operation occurs depending on the implementation.
|
|
||||||
///
|
|
||||||
/// - Parameter model: The model object to insert into the repository.
|
|
||||||
func insert(_ model: some PersistentModel)
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
import SwiftData
|
||||||
|
|
||||||
|
/// A protocol defining the interface for a todo repository.
|
||||||
|
///
|
||||||
|
/// This protocol abstracts the underlying data persistence mechanism for todo tasks,
|
||||||
|
/// allowing for dependency injection and easier testing. Implementations handle the
|
||||||
|
/// storage and retrieval of Todo objects.
|
||||||
|
protocol TodoRepository {
|
||||||
|
|
||||||
|
/// Deletes a todo task from the repository.
|
||||||
|
///
|
||||||
|
/// This method removes the specified todo from persistent storage. The deletion
|
||||||
|
/// is typically performed immediately, though the actual persistence may be deferred
|
||||||
|
/// until a save operation occurs depending on the implementation.
|
||||||
|
///
|
||||||
|
/// - Parameter todo: The todo task to delete from the repository.
|
||||||
|
func delete(_ todo: Todo)
|
||||||
|
|
||||||
|
/// Inserts a new todo task into the repository.
|
||||||
|
///
|
||||||
|
/// This method adds a new todo to persistent storage. The todo is typically
|
||||||
|
/// tracked immediately, though the actual persistence may be deferred until a
|
||||||
|
/// save operation occurs depending on the implementation.
|
||||||
|
///
|
||||||
|
/// - Parameter todo: The todo task to insert into the repository.
|
||||||
|
func insert(_ todo: Todo)
|
||||||
|
|
||||||
|
}
|
||||||
@@ -64,7 +64,7 @@ extension NewTaskView {
|
|||||||
/// The `note` property value is only included if it's not empty after trimming.
|
/// The `note` property value is only included if it's not empty after trimming.
|
||||||
///
|
///
|
||||||
/// - Parameter repository: The repository to insert a new todo task.
|
/// - Parameter repository: The repository to insert a new todo task.
|
||||||
func save(to repository: Repository) {
|
func save(to repository: TodoRepository) {
|
||||||
let trimmedTitle = title.trimmingCharacters(in: .whitespacesAndNewlines)
|
let trimmedTitle = title.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
let trimmedNote = note.trimmingCharacters(in: .whitespacesAndNewlines)
|
let trimmedNote = note.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ extension TaskListView {
|
|||||||
func delete(
|
func delete(
|
||||||
_ tasks: [Todo],
|
_ tasks: [Todo],
|
||||||
at offsets: IndexSet,
|
at offsets: IndexSet,
|
||||||
from repository: Repository
|
from repository: TodoRepository
|
||||||
) {
|
) {
|
||||||
for index in offsets {
|
for index in offsets {
|
||||||
repository.delete(tasks[index])
|
repository.delete(tasks[index])
|
||||||
|
|||||||
Reference in New Issue
Block a user