f21fa5b5e8
Commilitia Drop:自托管的跨设备剪贴板同步与点对点文件传输。 - 后端 Go(chi / SQLite WAL / SSE Hub / WebRTC signaling + 状态机 / Relay ring buffer),编译进单个 distroless 镜像(前端 go:embed)。 - 前端 React + TanStack Router + Zustand,自实现 SSE + WebRTC P2P,NAT 受阻时回退服务端中继;聚珍(Juzhen)CJK 综合排版。 - 桌面端 Wails v2(macOS / Windows),瘦客户端复用 web。 - 鉴权 OIDC PKCE(自建 Casdoor 等),refresh_token 信封加密存系统密钥库;iOS Shortcut 用 HS256 scoped token。 架构文档与变更记录见 docs 分支(PROJECT_BRIEF / FRONTEND_DESIGN / CHANGELOG)。 本次为公开发布初始提交:完整开发历史(含部署细节)留存于私有归档,公开仓库自此干净起步。
156 lines
3.9 KiB
Go
156 lines
3.9 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.31.1
|
|
// source: transfers.sql
|
|
|
|
package db
|
|
|
|
import (
|
|
"context"
|
|
)
|
|
|
|
const createTransferSession = `-- name: CreateTransferSession :exec
|
|
INSERT INTO transfer_sessions (
|
|
id, user_id, sender_name, receiver_name, state,
|
|
file_name, file_size, file_sha256, created_at
|
|
)
|
|
VALUES (?, ?, ?, ?, 'PENDING', ?, ?, ?, ?)
|
|
`
|
|
|
|
type CreateTransferSessionParams struct {
|
|
ID string `json:"id"`
|
|
UserID string `json:"user_id"`
|
|
SenderName string `json:"sender_name"`
|
|
ReceiverName string `json:"receiver_name"`
|
|
FileName string `json:"file_name"`
|
|
FileSize int64 `json:"file_size"`
|
|
FileSha256 *string `json:"file_sha256"`
|
|
CreatedAt int64 `json:"created_at"`
|
|
}
|
|
|
|
func (q *Queries) CreateTransferSession(ctx context.Context, arg CreateTransferSessionParams) error {
|
|
_, err := q.db.ExecContext(ctx, createTransferSession,
|
|
arg.ID,
|
|
arg.UserID,
|
|
arg.SenderName,
|
|
arg.ReceiverName,
|
|
arg.FileName,
|
|
arg.FileSize,
|
|
arg.FileSha256,
|
|
arg.CreatedAt,
|
|
)
|
|
return err
|
|
}
|
|
|
|
const expirePendingSessions = `-- name: ExpirePendingSessions :many
|
|
UPDATE transfer_sessions
|
|
SET state = 'CANCELLED',
|
|
fail_reason = 'pending_timeout',
|
|
finished_at = ?1
|
|
WHERE state = 'PENDING' AND created_at < ?2
|
|
RETURNING id, user_id, sender_name, receiver_name
|
|
`
|
|
|
|
type ExpirePendingSessionsParams struct {
|
|
FinishedAt *int64 `json:"finished_at"`
|
|
Cutoff int64 `json:"cutoff"`
|
|
}
|
|
|
|
type ExpirePendingSessionsRow struct {
|
|
ID string `json:"id"`
|
|
UserID string `json:"user_id"`
|
|
SenderName string `json:"sender_name"`
|
|
ReceiverName string `json:"receiver_name"`
|
|
}
|
|
|
|
func (q *Queries) ExpirePendingSessions(ctx context.Context, arg ExpirePendingSessionsParams) ([]ExpirePendingSessionsRow, error) {
|
|
rows, err := q.db.QueryContext(ctx, expirePendingSessions, arg.FinishedAt, arg.Cutoff)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []ExpirePendingSessionsRow
|
|
for rows.Next() {
|
|
var i ExpirePendingSessionsRow
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.UserID,
|
|
&i.SenderName,
|
|
&i.ReceiverName,
|
|
); 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
|
|
}
|
|
|
|
const getTransferSession = `-- name: GetTransferSession :one
|
|
SELECT id, user_id, sender_name, receiver_name, state, mode,
|
|
file_name, file_size, file_sha256, bytes_transferred,
|
|
created_at, finished_at, fail_reason
|
|
FROM transfer_sessions
|
|
WHERE id = ?
|
|
`
|
|
|
|
func (q *Queries) GetTransferSession(ctx context.Context, id string) (TransferSession, error) {
|
|
row := q.db.QueryRowContext(ctx, getTransferSession, id)
|
|
var i TransferSession
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.UserID,
|
|
&i.SenderName,
|
|
&i.ReceiverName,
|
|
&i.State,
|
|
&i.Mode,
|
|
&i.FileName,
|
|
&i.FileSize,
|
|
&i.FileSha256,
|
|
&i.BytesTransferred,
|
|
&i.CreatedAt,
|
|
&i.FinishedAt,
|
|
&i.FailReason,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const updateTransferState = `-- name: UpdateTransferState :execrows
|
|
UPDATE transfer_sessions
|
|
SET state = ?1,
|
|
mode = COALESCE(?2, mode),
|
|
fail_reason = COALESCE(?3, fail_reason),
|
|
finished_at = COALESCE(?4, finished_at),
|
|
bytes_transferred = COALESCE(?5, bytes_transferred)
|
|
WHERE id = ?6
|
|
`
|
|
|
|
type UpdateTransferStateParams struct {
|
|
State string `json:"state"`
|
|
Mode *string `json:"mode"`
|
|
FailReason *string `json:"fail_reason"`
|
|
FinishedAt *int64 `json:"finished_at"`
|
|
BytesTransferred *int64 `json:"bytes_transferred"`
|
|
ID string `json:"id"`
|
|
}
|
|
|
|
func (q *Queries) UpdateTransferState(ctx context.Context, arg UpdateTransferStateParams) (int64, error) {
|
|
result, err := q.db.ExecContext(ctx, updateTransferState,
|
|
arg.State,
|
|
arg.Mode,
|
|
arg.FailReason,
|
|
arg.FinishedAt,
|
|
arg.BytesTransferred,
|
|
arg.ID,
|
|
)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return result.RowsAffected()
|
|
}
|