mirror of
https://github.com/warmbly/warmbly.git
synced 2026-08-19 08:01:16 +00:00
177 lines
3.5 KiB
Go
177 lines
3.5 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/getsentry/sentry-go"
|
|
"github.com/google/uuid"
|
|
"github.com/jackc/pgx/v5"
|
|
"github.com/warmbly/warmbly/internal/errx"
|
|
"github.com/warmbly/warmbly/internal/infrastructure/db"
|
|
"github.com/warmbly/warmbly/internal/models"
|
|
)
|
|
|
|
func (r *emailRepository) GetSMTPIMAP(ctx context.Context, userID, emailAccountID string) (*models.SmtpImap, *errx.Error) {
|
|
var imap models.Service
|
|
var smtp models.Service
|
|
var ts time.Time
|
|
|
|
query := `
|
|
SELECT
|
|
smtp.smtp_host,
|
|
smtp.smtp_port,
|
|
smtp.smtp_user,
|
|
smtp.smtp_password,
|
|
smtp.imap_host,
|
|
smtp.imap_port,
|
|
smtp.imap_user,
|
|
smtp.imap_password,
|
|
smtp.updated_at
|
|
FROM
|
|
email_accounts ea
|
|
JOIN
|
|
email_accounts_smtp_imap smtp ON ea.id = smtp.email_account_id
|
|
WHERE
|
|
ea.user_id = $1
|
|
AND ea.id = $2
|
|
`
|
|
|
|
params := []any{
|
|
userID,
|
|
emailAccountID,
|
|
}
|
|
|
|
err := r.DB.QueryRow(
|
|
ctx,
|
|
query,
|
|
params...,
|
|
).Scan(
|
|
&smtp.Host, &smtp.Port, &smtp.Username, &smtp.Password,
|
|
&imap.Host, &imap.Port, &imap.Username, &imap.Password,
|
|
&ts,
|
|
)
|
|
if err != nil {
|
|
if errors.Is(err, pgx.ErrNoRows) {
|
|
return nil, nil
|
|
}
|
|
db.CaptureError(err, query, params, "queryrow")
|
|
return nil, errx.InternalError()
|
|
}
|
|
imap.Username, err = r.Encrypt.Decrypt(imap.Username)
|
|
if err != nil {
|
|
sentry.CaptureException(err)
|
|
return nil, errx.InternalError()
|
|
}
|
|
imap.Password, err = r.Encrypt.Decrypt(imap.Password)
|
|
if err != nil {
|
|
sentry.CaptureException(err)
|
|
return nil, errx.InternalError()
|
|
}
|
|
imap.Host, err = r.Encrypt.Decrypt(imap.Host)
|
|
if err != nil {
|
|
sentry.CaptureException(err)
|
|
return nil, errx.InternalError()
|
|
}
|
|
smtp.Username, err = r.Encrypt.Decrypt(smtp.Username)
|
|
if err != nil {
|
|
sentry.CaptureException(err)
|
|
return nil, errx.InternalError()
|
|
}
|
|
smtp.Password, err = r.Encrypt.Decrypt(smtp.Password)
|
|
if err != nil {
|
|
sentry.CaptureException(err)
|
|
return nil, errx.InternalError()
|
|
}
|
|
smtp.Host, err = r.Encrypt.Decrypt(smtp.Host)
|
|
if err != nil {
|
|
sentry.CaptureException(err)
|
|
return nil, errx.InternalError()
|
|
}
|
|
|
|
return &models.SmtpImap{
|
|
SMTP: &smtp,
|
|
IMAP: &imap,
|
|
}, nil
|
|
}
|
|
|
|
func (r *emailRepository) RevokeOauth(ctx context.Context, id string) *errx.Error {
|
|
tx, err := r.DB.Begin(ctx)
|
|
if err != nil {
|
|
db.CaptureError(err, "", nil, "begin")
|
|
return errx.InternalError()
|
|
}
|
|
defer tx.Rollback(ctx)
|
|
|
|
query := `
|
|
UPDATE email_accounts
|
|
SET status = 'revoked' WHERE id = $1
|
|
`
|
|
|
|
params := []any{
|
|
id,
|
|
}
|
|
_, err = tx.Exec(
|
|
ctx,
|
|
query,
|
|
params...,
|
|
)
|
|
if err != nil {
|
|
db.CaptureError(err, query, params, "exec")
|
|
return errx.InternalError()
|
|
}
|
|
|
|
query = `
|
|
DELETE FROM email_accounts_oauth
|
|
WHERE email_account_id = $1
|
|
`
|
|
|
|
params = []any{
|
|
id,
|
|
}
|
|
|
|
_, err = tx.Exec(
|
|
ctx,
|
|
query,
|
|
params...,
|
|
)
|
|
if err != nil {
|
|
db.CaptureError(err, query, params, "exec")
|
|
return errx.InternalError()
|
|
}
|
|
|
|
if err := tx.Commit(ctx); err != nil {
|
|
db.CaptureError(err, "", nil, "commit")
|
|
return errx.InternalError()
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *emailRepository) RefreshBoxToken(ctx context.Context, id uuid.UUID, accessToken, refreshToken string, expiresAt time.Time) error {
|
|
query := `
|
|
UPDATE email_accounts_oauth
|
|
SET access_token = $1, refresh_token = $2, expires_at = $3
|
|
WHERE email_account_id = $4
|
|
`
|
|
|
|
params := []any{
|
|
accessToken,
|
|
refreshToken,
|
|
expiresAt,
|
|
id,
|
|
}
|
|
|
|
_, err := r.DB.Exec(
|
|
ctx,
|
|
query,
|
|
params...,
|
|
)
|
|
if err != nil {
|
|
db.CaptureError(err, query, params, "exec")
|
|
return err
|
|
}
|
|
return nil
|
|
}
|