157 lines
4.8 KiB
Go
157 lines
4.8 KiB
Go
package repository
|
|
|
|
import (
|
|
"aggios-app/backend/internal/domain"
|
|
"database/sql"
|
|
"fmt"
|
|
)
|
|
|
|
type DocumentRepository struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
func NewDocumentRepository(db *sql.DB) *DocumentRepository {
|
|
return &DocumentRepository{db: db}
|
|
}
|
|
|
|
func (r *DocumentRepository) Create(doc *domain.Document) error {
|
|
query := `
|
|
INSERT INTO documents (id, tenant_id, parent_id, title, content, status, created_by, last_updated_by, version, created_at, updated_at)
|
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $7, 1, NOW(), NOW())
|
|
`
|
|
_, err := r.db.Exec(query, doc.ID, doc.TenantID, doc.ParentID, doc.Title, doc.Content, doc.Status, doc.CreatedBy)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return r.logActivity(doc.ID.String(), doc.TenantID.String(), doc.CreatedBy.String(), "created", "Criou o documento")
|
|
}
|
|
|
|
func (r *DocumentRepository) GetByTenant(tenantID string) ([]domain.Document, error) {
|
|
query := `
|
|
SELECT id, tenant_id, parent_id, title, content, status, created_by, last_updated_by, version, created_at, updated_at
|
|
FROM documents
|
|
WHERE tenant_id = $1 AND parent_id IS NULL
|
|
ORDER BY updated_at DESC
|
|
`
|
|
rows, err := r.db.Query(query, tenantID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var docs []domain.Document
|
|
for rows.Next() {
|
|
var doc domain.Document
|
|
if err := rows.Scan(&doc.ID, &doc.TenantID, &doc.ParentID, &doc.Title, &doc.Content, &doc.Status, &doc.CreatedBy, &doc.LastUpdatedBy, &doc.Version, &doc.CreatedAt, &doc.UpdatedAt); err != nil {
|
|
return nil, err
|
|
}
|
|
docs = append(docs, doc)
|
|
}
|
|
return docs, nil
|
|
}
|
|
|
|
func (r *DocumentRepository) GetSubpages(parentID, tenantID string) ([]domain.Document, error) {
|
|
query := `
|
|
SELECT id, tenant_id, parent_id, title, content, status, created_by, last_updated_by, version, created_at, updated_at
|
|
FROM documents
|
|
WHERE parent_id = $1 AND tenant_id = $2
|
|
ORDER BY created_at ASC
|
|
`
|
|
rows, err := r.db.Query(query, parentID, tenantID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var docs []domain.Document
|
|
for rows.Next() {
|
|
var doc domain.Document
|
|
if err := rows.Scan(&doc.ID, &doc.TenantID, &doc.ParentID, &doc.Title, &doc.Content, &doc.Status, &doc.CreatedBy, &doc.LastUpdatedBy, &doc.Version, &doc.CreatedAt, &doc.UpdatedAt); err != nil {
|
|
return nil, err
|
|
}
|
|
docs = append(docs, doc)
|
|
}
|
|
return docs, nil
|
|
}
|
|
|
|
func (r *DocumentRepository) GetByID(id, tenantID string) (*domain.Document, error) {
|
|
query := `
|
|
SELECT id, tenant_id, parent_id, title, content, status, created_by, last_updated_by, version, created_at, updated_at
|
|
FROM documents
|
|
WHERE id = $1 AND tenant_id = $2
|
|
`
|
|
var doc domain.Document
|
|
err := r.db.QueryRow(query, id, tenantID).Scan(
|
|
&doc.ID, &doc.TenantID, &doc.ParentID, &doc.Title, &doc.Content, &doc.Status, &doc.CreatedBy, &doc.LastUpdatedBy, &doc.Version, &doc.CreatedAt, &doc.UpdatedAt,
|
|
)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return nil, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
return &doc, nil
|
|
}
|
|
|
|
func (r *DocumentRepository) Update(doc *domain.Document) error {
|
|
query := `
|
|
UPDATE documents
|
|
SET title = $1, content = $2, status = $3, last_updated_by = $4, version = version + 1, updated_at = NOW()
|
|
WHERE id = $5 AND tenant_id = $6
|
|
`
|
|
_, err := r.db.Exec(query, doc.Title, doc.Content, doc.Status, doc.LastUpdatedBy, doc.ID, doc.TenantID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return r.logActivity(doc.ID.String(), doc.TenantID.String(), doc.LastUpdatedBy.String(), "updated", "Atualizou o conteúdo")
|
|
}
|
|
|
|
func (r *DocumentRepository) Delete(id, tenantID string) error {
|
|
query := "DELETE FROM documents WHERE id = $1 AND tenant_id = $2"
|
|
res, err := r.db.Exec(query, id, tenantID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
rows, _ := res.RowsAffected()
|
|
if rows == 0 {
|
|
return fmt.Errorf("document not found")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (r *DocumentRepository) logActivity(docID, tenantID, userID, action, description string) error {
|
|
query := `
|
|
INSERT INTO document_activities (document_id, tenant_id, user_id, action, description)
|
|
VALUES ($1, $2, $3, $4, $5)
|
|
`
|
|
_, err := r.db.Exec(query, docID, tenantID, userID, action, description)
|
|
return err
|
|
}
|
|
|
|
func (r *DocumentRepository) GetActivities(docID, tenantID string) ([]domain.DocumentActivity, error) {
|
|
query := `
|
|
SELECT a.id, a.document_id, a.tenant_id, a.user_id, COALESCE(u.first_name, 'Usuário Removido') as user_name, a.action, a.description, a.created_at
|
|
FROM document_activities a
|
|
LEFT JOIN users u ON a.user_id = u.id
|
|
WHERE a.document_id = $1 AND a.tenant_id = $2
|
|
ORDER BY a.created_at DESC
|
|
LIMIT 20
|
|
`
|
|
rows, err := r.db.Query(query, docID, tenantID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var activities []domain.DocumentActivity
|
|
for rows.Next() {
|
|
var a domain.DocumentActivity
|
|
err := rows.Scan(&a.ID, &a.DocumentID, &a.TenantID, &a.UserID, &a.UserName, &a.Action, &a.Description, &a.CreatedAt)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
activities = append(activities, a)
|
|
}
|
|
return activities, nil
|
|
}
|