ContextKit.CRUD (ContextKit v0.1.0)
View SourceThe ContextKit.CRUD
module provides a convenient way to generate standard CRUD (Create, Read, Update, Delete)
operations for your Ecto schemas. It reduces boilerplate code by automatically generating commonly used database
interaction functions.
Setup
Add the following to your context module:
defmodule MyApp.Accounts do
use ContextKit.CRUD,
repo: MyApp.Repo,
schema: MyApp.Accounts.User,
queries: MyApp.Accounts.UserQueries,
except: [:delete], # Optional: exclude specific operations
plural_resource_name: "users" # Optional: customize plural name
end
Required Options
:repo
- The Ecto repository module to use for database operations:schema
- The Ecto schema module that defines your resource:queries
- Module containing query-building functions for advanced filtering
Optional Options
:except
- List of operation types to exclude (:list
,:get
,:one
,:delete
):plural_resource_name
- Custom plural name for list functions (defaults to singular + "s")
Generated Functions
For a schema named User
, the following functions are generated:
List Operations
list_users/0
- Returns all userslist_users/1
- Returns filtered users based on options
Get Operations
get_user/1
- Fetches a single user by IDget_user/2
- Fetches a user by ID with additional filtersget_user!/1
- Likeget_user/1
but raises if not foundget_user!/2
- Likeget_user/2
but raises if not found
Single Record Operations
one_user/1
- Fetches a single user matching the criteriaone_user!/1
- Likeone_user/1
but raises if not found
Delete Operations
delete_user/1
- Deletes a user struct or by query criteria
Query Options
All functions that accept options support:
- Basic filtering with field-value pairs
- Complex queries via
Ecto.Query
- Pagination via
paginate: true
orpaginate: [page: 1, per_page: 20]
- Custom query options defined in your queries module
Examples
# List all users
MyApp.Accounts.list_users()
# List active users with pagination
MyApp.Accounts.list_users(status: :active, paginate: [page: 1])
# Get user by ID with preloads
MyApp.Accounts.get_user(123, preload: [:posts])
# Delete user matching criteria
MyApp.Accounts.delete_user(email: "user@example.com")
Each generated function can be overridden in your context module if you need custom behavior.