diff --git a/internal/database/db.go b/internal/database/db.go new file mode 100644 index 0000000..9f7a5a6 --- /dev/null +++ b/internal/database/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package database + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/internal/database/models.go b/internal/database/models.go new file mode 100644 index 0000000..a3994d0 --- /dev/null +++ b/internal/database/models.go @@ -0,0 +1,18 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 + +package database + +import ( + "time" +) + +type FtsTransaction struct { + TransactionID int32 + Description string + Amount string + Category string + TransactionDate time.Time + CreatedAt time.Time +} diff --git a/internal/database/transaction.sql.go b/internal/database/transaction.sql.go new file mode 100644 index 0000000..1c13bbc --- /dev/null +++ b/internal/database/transaction.sql.go @@ -0,0 +1,110 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.31.1 +// source: transaction.sql + +package database + +import ( + "context" + "time" +) + +const createTransaction = `-- name: CreateTransaction :one +INSERT INTO fts.transactions ( + description, amount, category, transaction_date +) VALUES ( + $1, $2, $3, $4 +) +RETURNING transaction_id, description, amount, category, transaction_date, created_at +` + +type CreateTransactionParams struct { + Description string + Amount string + Category string + TransactionDate time.Time +} + +func (q *Queries) CreateTransaction(ctx context.Context, arg CreateTransactionParams) (FtsTransaction, error) { + row := q.db.QueryRowContext(ctx, createTransaction, + arg.Description, + arg.Amount, + arg.Category, + arg.TransactionDate, + ) + var i FtsTransaction + err := row.Scan( + &i.TransactionID, + &i.Description, + &i.Amount, + &i.Category, + &i.TransactionDate, + &i.CreatedAt, + ) + return i, err +} + +const deleteTransaction = `-- name: DeleteTransaction :exec +DELETE FROM fts.transactions +WHERE transaction_id = $1 +` + +func (q *Queries) DeleteTransaction(ctx context.Context, transactionID int32) error { + _, err := q.db.ExecContext(ctx, deleteTransaction, transactionID) + return err +} + +const getTransaction = `-- name: GetTransaction :one +SELECT transaction_id, description, amount, category, transaction_date, created_at FROM fts.transactions +WHERE transaction_id = $1 +` + +func (q *Queries) GetTransaction(ctx context.Context, transactionID int32) (FtsTransaction, error) { + row := q.db.QueryRowContext(ctx, getTransaction, transactionID) + var i FtsTransaction + err := row.Scan( + &i.TransactionID, + &i.Description, + &i.Amount, + &i.Category, + &i.TransactionDate, + &i.CreatedAt, + ) + return i, err +} + +const listTransactions = `-- name: ListTransactions :many +SELECT transaction_id, description, amount, category, transaction_date, created_at FROM fts.transactions +ORDER BY transaction_date DESC, transaction_id DESC +` + +func (q *Queries) ListTransactions(ctx context.Context) ([]FtsTransaction, error) { + rows, err := q.db.QueryContext(ctx, listTransactions) + if err != nil { + return nil, err + } + defer rows.Close() + var items []FtsTransaction + for rows.Next() { + var i FtsTransaction + if err := rows.Scan( + &i.TransactionID, + &i.Description, + &i.Amount, + &i.Category, + &i.TransactionDate, + &i.CreatedAt, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/sql/queries/transaction.sql b/sql/queries/transaction.sql new file mode 100644 index 0000000..0c06dc5 --- /dev/null +++ b/sql/queries/transaction.sql @@ -0,0 +1,19 @@ +-- name: CreateTransaction :one +INSERT INTO fts.transactions ( + description, amount, category, transaction_date +) VALUES ( + $1, $2, $3, $4 +) +RETURNING *; + +-- name: ListTransactions :many +SELECT * FROM fts.transactions +ORDER BY transaction_date DESC, transaction_id DESC; + +-- name: GetTransaction :one +SELECT * FROM fts.transactions +WHERE transaction_id = $1; + +-- name: DeleteTransaction :exec +DELETE FROM fts.transactions +WHERE transaction_id = $1; diff --git a/sql/schema/001_transaction.sql b/sql/schema/001_transaction.sql new file mode 100644 index 0000000..d6fb02e --- /dev/null +++ b/sql/schema/001_transaction.sql @@ -0,0 +1,18 @@ +-- +goose Up +CREATE SCHEMA IF NOT EXISTS fts; + +CREATE TABLE fts.transactions ( + transaction_id SERIAL PRIMARY KEY, + description TEXT NOT NULL, + amount NUMERIC(12, 2) NOT NULL, + category VARCHAR(50) NOT NULL, + transaction_date TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +-- Index for querying transactions by date +CREATE INDEX idx_transactions_date ON fts.transactions(transaction_date); + +-- +goose Down +DROP INDEX IF EXISTS fts.idx_transactions_date; +DROP TABLE IF EXISTS fts.transactions; diff --git a/sqlc.yaml b/sqlc.yaml new file mode 100644 index 0000000..08ef51e --- /dev/null +++ b/sqlc.yaml @@ -0,0 +1,8 @@ +version: "2" +sql: + - schema: "sql/schema" + queries: "sql/queries" + engine: "postgresql" + gen: + go: + out: "internal/database"