dana-medical-site/internal/storage/share.go
2026-10-14 13:33:13 +00:00

56 lines
1.9 KiB
Go

package storage
import (
"context"
"errors"
"time"
"github.com/jackc/pgx/v5"
)
// ShareLink — состояние ссылки «только просмотр» на дашборд клиники (без самого токена).
type ShareLink struct {
Exists bool `json:"exists"`
CreatedAt *time.Time `json:"created_at"`
LastUsedAt *time.Time `json:"last_used_at"`
}
// SetShareLink выпускает ссылку клиники: прежняя перестаёт работать.
func (s *Storage) SetShareLink(ctx context.Context, clinic, tokenHash string, adminID int64) error {
_, err := s.pool.Exec(ctx, `
INSERT INTO share_links (clinic, token_hash, admin_id) VALUES ($1,$2,$3)
ON CONFLICT (clinic) DO UPDATE SET token_hash=EXCLUDED.token_hash, admin_id=EXCLUDED.admin_id,
created_at=now(), last_used_at=NULL`, clinic, tokenHash, adminID)
return err
}
func (s *Storage) DeleteShareLink(ctx context.Context, clinic string) error {
_, err := s.pool.Exec(ctx, `DELETE FROM share_links WHERE clinic=$1`, clinic)
return err
}
func (s *Storage) ShareLinkInfo(ctx context.Context, clinic string) (ShareLink, error) {
var l ShareLink
err := s.pool.QueryRow(ctx, `SELECT created_at, last_used_at FROM share_links WHERE clinic=$1`, clinic).
Scan(&l.CreatedAt, &l.LastUsedAt)
if errors.Is(err, pgx.ErrNoRows) {
return ShareLink{}, nil
}
l.Exists = err == nil
return l, err
}
// ShareLinkClinic — клиника по хешу токена (заодно отмечает время открытия);
// ErrNotFound, если ссылки нет или её перевыпустили.
func (s *Storage) ShareLinkClinic(ctx context.Context, tokenHash string) (string, error) {
var clinic string
err := s.pool.QueryRow(ctx, `
UPDATE share_links SET last_used_at = now()
WHERE token_hash = $1
RETURNING clinic`, tokenHash).Scan(&clinic)
if errors.Is(err, pgx.ErrNoRows) {
return "", ErrNotFound
}
return clinic, err
}