ContextKit.CRUD (ContextKit v0.1.0)

View Source

The 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 users
  • list_users/1 - Returns filtered users based on options

Get Operations

  • get_user/1 - Fetches a single user by ID
  • get_user/2 - Fetches a user by ID with additional filters
  • get_user!/1 - Like get_user/1 but raises if not found
  • get_user!/2 - Like get_user/2 but raises if not found

Single Record Operations

  • one_user/1 - Fetches a single user matching the criteria
  • one_user!/1 - Like one_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 or paginate: [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.