Files
LambdaMail/services/protocols/internal/infrastructure/postgres/copy_repository.go
T
Lucas Rayan caf52c0225 refactor(mail): one MailStore changes message state for every path
Flags, expunge, move, copy and folder deletion each existed twice: once for IMAP
(FlagRepository, ExpungeRepository, CopyRepository) and once for the webmail
(WebmailRepository). They kept the cached numbers true on their own and drifted:

- reading a message over IMAP never moved the folder's unread counter
- deleting in the webmail, or deleting a folder, never gave the quota back
- an IMAP expunge could push a counter below zero

MailStore now holds each state change once, in one transaction, with the same
rules everywhere: counters never go negative, a change that alters what a client
can observe raises the folder's modseq (one that alters nothing does not), the
quota follows the bytes, and a message is located by folder. The four repositories
are thin adapters that only translate how each path names a message.

The contract test added before this change (which failed on 8 of its cases)
now passes, as does the full suite.
2026-10-16 13:15:32 -03:00

23 lines
584 B
Go

package postgres
import (
"context"
"github.com/jackc/pgx/v5/pgxpool"
"lambdamail/protocols/internal/application/port"
)
// CopyRepository implements port.CopyRepository (IMAP COPY) over MailStore.
type CopyRepository struct {
store *MailStore
}
func NewCopyRepository(pool *pgxpool.Pool) *CopyRepository {
return &CopyRepository{store: NewMailStore(pool)}
}
func (r *CopyRepository) CopyMessages(ctx context.Context, sourceFolderID string, uids []uint32, destFolderID string) ([]port.CopiedMessage, error) {
return r.store.Copy(ctx, sourceFolderID, uids, destFolderID)
}