Skip to content

Commit

Permalink
Text search in mail spooler
Browse files Browse the repository at this point in the history
  • Loading branch information
r3-gabriel committed May 19, 2023
1 parent 25f54dc commit d218917
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 23 deletions.
52 changes: 43 additions & 9 deletions mail/mail.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package mail

import (
"fmt"
"r3/db"
"r3/types"

"github.com/jackc/pgx/v5"
)

var searchFields = []string{"from_list", "to_list", "cc_list", "bcc_list", "subject", "body"}

// mail spooler
func Del_tx(tx pgx.Tx, ids []int64) error {
for _, id := range ids {
Expand All @@ -20,28 +23,45 @@ func Del_tx(tx pgx.Tx, ids []int64) error {
return nil
}

func Get(limit int, offset int) ([]types.Mail, int64, error) {
mails := make([]types.Mail, 0)
func Get(limit int, offset int, search string) ([]types.Mail, int64, error) {

// prepare SQL request and arguments
sqlArgs := make([]interface{}, 0)
sqlArgs = append(sqlArgs, limit)
sqlArgs = append(sqlArgs, offset)
sqlWhere := ""
if search != "" {
for i, field := range searchFields {
connector := "WHERE"
if i != 0 {
connector = "OR"
}
sqlArgs = append(sqlArgs, fmt.Sprintf("%%%s%%", search))
sqlWhere = fmt.Sprintf("%s%s %s ILIKE $%d\n", sqlWhere, connector, field, len(sqlArgs))
}
}

rows, err := db.Pool.Query(db.Ctx, `
mails := make([]types.Mail, 0)
rows, err := db.Pool.Query(db.Ctx, fmt.Sprintf(`
SELECT id, from_list, to_list, cc_list, bcc_list, subject,
body, attempt_count, attempt_date, outgoing, date,
mail_account_id, record_id_wofk, attribute_id,
COALESCE((
SELECT COUNT(position)
FROM instance.mail_spool_file
WHERE mail_id = id
WHERE mail_id = m.id
),0),
COALESCE((
SELECT SUM(file_size)
FROM instance.mail_spool_file
WHERE mail_id = id
WHERE mail_id = m.id
),0)
FROM instance.mail_spool AS m
%s
ORDER BY date DESC
LIMIT $1
OFFSET $2
`, limit, offset)
`, sqlWhere), sqlArgs...)
if err != nil {
return mails, 0, err
}
Expand All @@ -59,12 +79,26 @@ func Get(limit int, offset int) ([]types.Mail, int64, error) {
mails = append(mails, m)
}

// get total
// get total count
sqlArgs = make([]interface{}, 0)
sqlWhere = ""
if search != "" {
for i, field := range searchFields {
connector := "WHERE"
if i != 0 {
connector = "OR"
}
sqlArgs = append(sqlArgs, fmt.Sprintf("%%%s%%", search))
sqlWhere = fmt.Sprintf("%s%s %s ILIKE $%d\n", sqlWhere, connector, field, len(sqlArgs))
}
}

var total int64
if err := db.Pool.QueryRow(db.Ctx, `
if err := db.Pool.QueryRow(db.Ctx, fmt.Sprintf(`
SELECT COUNT(*)
FROM instance.mail_spool
`).Scan(&total); err != nil {
%s
`, sqlWhere), sqlArgs...).Scan(&total); err != nil {
return mails, 0, err
}
return mails, total, nil
Expand Down
7 changes: 4 additions & 3 deletions request/request_mail.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,9 @@ func MailGet(reqJson json.RawMessage) (interface{}, error) {
var (
err error
req struct {
Limit int `json:"limit"`
Offset int `json:"offset"`
Limit int `json:"limit"`
Offset int `json:"offset"`
Search string `json:"search"`
}
res struct {
Mails []types.Mail `json:"mails"`
Expand All @@ -41,7 +42,7 @@ func MailGet(reqJson json.RawMessage) (interface{}, error) {
return nil, err
}

res.Mails, res.Total, err = mail.Get(req.Limit, req.Offset)
res.Mails, res.Total, err = mail.Get(req.Limit, req.Offset, req.Search)
if err != nil {
return nil, err
}
Expand Down
26 changes: 15 additions & 11 deletions www/comps/admin/adminMails.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@ let MyAdminMails = {
<option>500</option>
<option>1000</option>
</select>
<div class="row gap">
<input v-model="search" @keyup.enter="startAtPageFirst" :placeholder="capGen.threeDots" />
<my-button image="search.png" @trigger="startAtPageFirst" />
</div>
</div>
</div>
Expand Down Expand Up @@ -112,11 +117,14 @@ let MyAdminMails = {
},
data() {
return {
// inputs
limit:50,
offset:0,
search:'',

// mails
mails:[],
mailIdsSelected:[],
limit:50,
offset:0,
total:0,

// mail accounts
Expand All @@ -130,7 +138,7 @@ let MyAdminMails = {
},
computed:{
// simple
noMails:(s) => s.offset === 0 && s.mails.length === 0,
noMails:(s) => s.total === 0,
pages: (s) => Math.ceil(s.total / s.limit),

// stores
Expand All @@ -145,12 +153,8 @@ let MyAdminMails = {

// presentation
displaySendAttempts(mail) {
if(!mail.outgoing)
return '';

if(mail.attemptCount === 0)
return '-';

if(!mail.outgoing) return '';
if(mail.attemptCount === 0) return '-';
return `${mail.attemptCount}/5 (${this.getUnixFormat(mail.attemptDate,this.settings.dateFormat+' H:i')})`;
},
displayAttach(mail) {
Expand Down Expand Up @@ -185,7 +189,6 @@ let MyAdminMails = {
offsetSet(add) {
if(add) this.offset += this.limit;
else this.offset -= this.limit;

this.get();
},
toggleMailAll() {
Expand Down Expand Up @@ -221,7 +224,8 @@ let MyAdminMails = {
get() {
ws.send('mail','get',{
limit:this.limit,
offset:this.offset
offset:this.offset,
search:this.search
},true).then(
res => {
this.mails = res.payload.mails;
Expand Down

0 comments on commit d218917

Please sign in to comment.