Add mailer API and initial mailer view
This commit is contained in:
parent
0d8d7f3aeb
commit
eb27af7d90
10 changed files with 479 additions and 0 deletions
88
platform/mailer.go
Normal file
88
platform/mailer.go
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
package platform
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/Gleipnir-Technology/bob"
|
||||
"github.com/Gleipnir-Technology/bob/dialect/psql"
|
||||
"github.com/Gleipnir-Technology/bob/dialect/psql/dialect"
|
||||
"github.com/Gleipnir-Technology/bob/dialect/psql/sm"
|
||||
"github.com/Gleipnir-Technology/nidus-sync/db"
|
||||
"github.com/Gleipnir-Technology/nidus-sync/db/models"
|
||||
"github.com/Gleipnir-Technology/nidus-sync/platform/types"
|
||||
"github.com/stephenafamo/scan"
|
||||
)
|
||||
|
||||
func MailerByID(ctx context.Context, user User, id int32) (*types.Mailer, error) {
|
||||
query := mailerQuery()
|
||||
query.Apply(
|
||||
sm.Where(models.ComplianceReportRequests.Columns.ID.EQ(psql.Arg(id))),
|
||||
sm.Where(
|
||||
models.Sites.Columns.OrganizationID.EQ(psql.Arg(user.Organization.ID)),
|
||||
),
|
||||
)
|
||||
mailers, err := mailerQueryToRows(ctx, query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return mailers[id], nil
|
||||
}
|
||||
func MailerList(ctx context.Context, user User, limit int) ([]*types.Mailer, error) {
|
||||
query := mailerQuery()
|
||||
query.Apply(
|
||||
sm.Where(
|
||||
models.Sites.Columns.OrganizationID.EQ(psql.Arg(user.Organization.ID)),
|
||||
),
|
||||
sm.OrderBy(models.ComplianceReportRequests.Columns.Created),
|
||||
sm.Limit(limit),
|
||||
)
|
||||
return mailerQueryToRows(ctx, query)
|
||||
}
|
||||
func mailerQuery() bob.BaseQuery[*dialect.SelectQuery] {
|
||||
return psql.Select(
|
||||
sm.Columns(
|
||||
models.Addresses.Columns.Country.As("address.country"),
|
||||
models.Addresses.Columns.Locality.As("address.locality"),
|
||||
//sm.From(psql.F("COALESCE", psql.Raw("address.location_latitude"), 0)).As("address.location.latitude"),
|
||||
//sm.From(psql.F("COALESCE", psql.Raw("address.location_longitude"), 0)).As("address.location.longitude"),
|
||||
"COALESCE(address.location_latitude, 0) AS \"address.location.latitude\"",
|
||||
"COALESCE(address.location_longitude, 0) AS \"address.location.longitude\"",
|
||||
models.Addresses.Columns.Number.As("address.number"),
|
||||
models.Addresses.Columns.PostalCode.As("address.postal_code"),
|
||||
models.Addresses.Columns.Region.As("address.region"),
|
||||
models.Addresses.Columns.Street.As("address.street"),
|
||||
models.Addresses.Columns.Unit.As("address.unit"),
|
||||
models.ComplianceReportRequests.Columns.Created.As("created"),
|
||||
models.ComplianceReportRequests.Columns.PublicID.As("compliance_report_request_id"),
|
||||
models.Sites.Columns.ID.As("site_id"),
|
||||
models.Sites.Columns.OwnerName.As("recipient"),
|
||||
"'created' AS \"status\"",
|
||||
),
|
||||
sm.From(models.ComplianceReportRequestMailers.Name()),
|
||||
sm.InnerJoin(models.ComplianceReportRequests.Name()).OnEQ(
|
||||
models.ComplianceReportRequestMailers.Columns.ComplianceReportRequestID,
|
||||
models.ComplianceReportRequests.Columns.ID,
|
||||
),
|
||||
sm.InnerJoin(models.Leads.Name()).OnEQ(
|
||||
models.ComplianceReportRequests.Columns.LeadID,
|
||||
models.Leads.Columns.ID,
|
||||
),
|
||||
sm.InnerJoin(models.Sites.Name()).OnEQ(
|
||||
models.Leads.Columns.SiteID,
|
||||
models.Sites.Columns.ID,
|
||||
),
|
||||
sm.InnerJoin(models.Addresses.Name()).OnEQ(
|
||||
models.Sites.Columns.AddressID,
|
||||
models.Addresses.Columns.ID,
|
||||
),
|
||||
)
|
||||
}
|
||||
func mailerQueryToRows(ctx context.Context, query bob.BaseQuery[*dialect.SelectQuery]) ([]*types.Mailer, error) {
|
||||
rows, err := bob.All(ctx, db.PGInstance.BobDB, query, scan.StructMapper[*types.Mailer]())
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("query mailers: %w", err)
|
||||
}
|
||||
|
||||
return rows, nil
|
||||
}
|
||||
16
platform/types/mailer.go
Normal file
16
platform/types/mailer.go
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
package types
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
type Mailer struct {
|
||||
Address Address `json:"address"`
|
||||
ComplianceReportRequestID *string `json:"compliance_report_request_id"`
|
||||
Created time.Time `json:"created"`
|
||||
ID int32 `json:"id"`
|
||||
Recipient string `json:"recipient"`
|
||||
SiteID int32 `json:"site_id"`
|
||||
Status string `json:"status"`
|
||||
URI string `json:"uri"`
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue