Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
midoks committed Jul 27, 2024
1 parent 12ae9e9 commit 09f3374
Show file tree
Hide file tree
Showing 15 changed files with 184 additions and 175 deletions.
2 changes: 2 additions & 0 deletions .zzz.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,11 @@ action:
before:
- find . -name ".DS_Store" -print -delete
- rm -rf logs/run_away.log
- gofmt -w ./
- go generate internal/assets/conf/conf.go
- go generate internal/assets/public/public.go
- go generate internal/assets/templates/templates.go

after:
- ps -ef|grep 'imail service'| grep -v grep | awk '{print $2}' | xargs kill -9
- ./imail service &
Expand Down
6 changes: 3 additions & 3 deletions internal/app/context/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ type Context struct {
IsTokenAuth bool
}

//json api common data
// json api common data
type JsonMsg struct {
Code int64 `json:"code"`
Msg string `json:"msg"`
Expand Down Expand Up @@ -118,7 +118,7 @@ func (c *Context) JSONSuccess(data interface{}) {
c.JSON(http.StatusOK, data)
}

//JSON Success Message
// JSON Success Message
func (c *Context) OK(msg string) {
c.JSONSuccess(JsonMsg{Code: 0, Msg: msg})
}
Expand All @@ -127,7 +127,7 @@ func (c *Context) OKDATA(msg string, data interface{}) {
c.JSONSuccess(JsonMsg{Code: 0, Msg: msg, Data: data})
}

//JSON Fail Message
// JSON Fail Message
func (c *Context) Fail(code int64, msg string) {
c.JSONSuccess(JsonMsg{Code: code, Msg: msg})
}
Expand Down
2 changes: 1 addition & 1 deletion internal/app/router/mail/mail.go
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,7 @@ func ApiDeleted(c *context.Context, f form.MailIDs) {
}
}

//TODO:硬删除
// TODO:硬删除
func ApiHardDeleted(c *context.Context, f form.MailIDs) {
ids := f.Ids
idsSlice, err := tools.ToSlice(ids)
Expand Down
3 changes: 2 additions & 1 deletion internal/component/multipart.go
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,8 @@ func (mr *MultipartReader) isBoundaryDelimiterLine(line []byte) (ret bool) {

// skipLWSPChar returns b with leading spaces and tabs removed.
// RFC 822 defines:
// LWSP-char = SPACE / HTAB
//
// LWSP-char = SPACE / HTAB
func skipLWSPChar(b []byte) []byte {
for len(b) > 0 && (b[0] == ' ' || b[0] == '\t') {
b = b[1:]
Expand Down
2 changes: 1 addition & 1 deletion internal/db/box.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func BoxUserTotal(uid int64) (int64, int64) {
return 0, 0
}

//Get statistics under classification
// Get statistics under classification
func BoxUserMessageCountByClassName(uid int64, className string) (int64, int64) {
type Result struct {
Count int64
Expand Down
256 changes: 128 additions & 128 deletions internal/db/db.go
Original file line number Diff line number Diff line change
@@ -1,162 +1,162 @@
package db

import (
"database/sql"
"fmt"
"log"
"os"
"path/filepath"
"strings"
"time"

"github.com/pkg/errors"
"gorm.io/driver/mysql"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"

"github.com/midoks/imail/internal/conf"
imlog "github.com/midoks/imail/internal/log"
"database/sql"
"fmt"
"log"
"os"
"path/filepath"
"strings"
"time"

"github.com/pkg/errors"
"gorm.io/driver/mysql"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"

"github.com/midoks/imail/internal/conf"
imlog "github.com/midoks/imail/internal/log"
)

var (
db *gorm.DB
err error
db *gorm.DB
err error
)

var Tables = []interface{}{
new(User), new(Domain), new(Mail),
new(MailLog), new(MailContent), new(Box),
new(Class), new(Queue),
new(User), new(Domain), new(Mail),
new(MailLog), new(MailContent), new(Box),
new(Class), new(Queue),
}

func getEngine() (*sql.DB, error) {

newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
logger.Config{
SlowThreshold: time.Second, // 慢 SQL 阈值
LogLevel: logger.Silent, // Log level
Colorful: false, // 禁用彩色打印
},
)

switch conf.Database.Type {
case "mysql":
dbUser := conf.Database.User
dbPwd := conf.Database.Password
dbHost := conf.Database.Host

dbName := conf.Database.Name
dbCharset := conf.Database.Charset

dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=%s&parseTime=True", dbUser, dbPwd, dbHost, dbName, dbCharset)
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: newLogger,
})

case "sqlite3":
os.MkdirAll(conf.Web.AppDataPath, os.ModePerm)
dbPath := conf.Database.Path
if strings.EqualFold(conf.Database.Path, "data/imail.db3") {
dbPath = filepath.Dir(conf.Web.AppDataPath) + "/" + conf.Database.Path
}
db, err = gorm.Open(sqlite.Open(dbPath), &gorm.Config{
Logger: newLogger,
SkipDefaultTransaction: true,
PrepareStmt: true,
})

// synchronous close
db.Exec("PRAGMA synchronous = OFF;")
default:
return nil, errors.New("database type not found")
}

if err != nil {
imlog.Errorf("init db err,link error:%s", err)
return nil, err
}

sqlDB, err := db.DB()
if err != nil {
imlog.Errorf("[DB]:%s", err)
return nil, err
}

sqlDB.SetMaxIdleConns(conf.Database.MaxIdleConns)
sqlDB.SetMaxOpenConns(conf.Database.MaxOpenConns)
sqlDB.SetConnMaxLifetime(time.Hour)

if !conf.IsProdMode() {
db.Debug()
}

return sqlDB, nil
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
logger.Config{
SlowThreshold: time.Second, // 慢 SQL 阈值
LogLevel: logger.Silent, // Log level
Colorful: false, // 禁用彩色打印
},
)

switch conf.Database.Type {
case "mysql":
dbUser := conf.Database.User
dbPwd := conf.Database.Password
dbHost := conf.Database.Host

dbName := conf.Database.Name
dbCharset := conf.Database.Charset

dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=%s&parseTime=True", dbUser, dbPwd, dbHost, dbName, dbCharset)
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: newLogger,
})

case "sqlite3":
os.MkdirAll(conf.Web.AppDataPath, os.ModePerm)
dbPath := conf.Database.Path
if strings.EqualFold(conf.Database.Path, "data/imail.db3") {
dbPath = filepath.Dir(conf.Web.AppDataPath) + "/" + conf.Database.Path
}
db, err = gorm.Open(sqlite.Open(dbPath), &gorm.Config{
Logger: newLogger,
SkipDefaultTransaction: true,
PrepareStmt: true,
})

// synchronous close
db.Exec("PRAGMA synchronous = OFF;")
default:
return nil, errors.New("database type not found")
}

if err != nil {
imlog.Errorf("init db err,link error:%s", err)
return nil, err
}

sqlDB, err := db.DB()
if err != nil {
imlog.Errorf("[DB]:%s", err)
return nil, err
}

sqlDB.SetMaxIdleConns(conf.Database.MaxIdleConns)
sqlDB.SetMaxOpenConns(conf.Database.MaxOpenConns)
sqlDB.SetConnMaxLifetime(time.Hour)

if !conf.IsProdMode() {
db.Debug()
}

return sqlDB, nil
}

func Init() error {
_, err := getEngine()
if err != nil {
return err
}

// db.AutoMigrate(&User{})
// db.AutoMigrate(&Domain{})
// db.AutoMigrate(&Mail{})
// db.AutoMigrate(&MailLog{})
// db.AutoMigrate(&MailContent{})
// db.AutoMigrate(&Box{})
// db.AutoMigrate(&Class{})
// db.AutoMigrate(&Queue{})

for _, table := range Tables {
if db.Migrator().HasTable(table) {
continue
}

name := strings.TrimPrefix(fmt.Sprintf("%T", table), "*db.")
err = db.Migrator().AutoMigrate(table)
if err != nil {
return errors.Wrapf(err, "auto migrate %q", name)
}
}

return nil
_, err := getEngine()
if err != nil {
return err
}

// db.AutoMigrate(&User{})
// db.AutoMigrate(&Domain{})
// db.AutoMigrate(&Mail{})
// db.AutoMigrate(&MailLog{})
// db.AutoMigrate(&MailContent{})
// db.AutoMigrate(&Box{})
// db.AutoMigrate(&Class{})
// db.AutoMigrate(&Queue{})

for _, table := range Tables {
if db.Migrator().HasTable(table) {
continue
}

name := strings.TrimPrefix(fmt.Sprintf("%T", table), "*db.")
err = db.Migrator().AutoMigrate(table)
if err != nil {
return errors.Wrapf(err, "auto migrate %q", name)
}
}

return nil
}

type Statistic struct {
Counter struct {
User int64
VaildUser int64
}
Counter struct {
User int64
VaildUser int64
}
}

func Ping() error {
sqlDB, err := db.DB()
if err != nil {
return err
}
return sqlDB.Ping()
sqlDB, err := db.DB()
if err != nil {
return err
}
return sqlDB.Ping()
}

func GetStatistic() (stats Statistic) {

//user count
stats.Counter.User = UsersCount()
//user count
stats.Counter.User = UsersCount()

//vaild user count
stats.Counter.VaildUser = UsersVaildCount()
return stats
//vaild user count
stats.Counter.VaildUser = UsersVaildCount()
return stats
}

func TablePrefix(tn string) string {
return fmt.Sprintf("%s%s", conf.Database.Prefix, tn)
return fmt.Sprintf("%s%s", conf.Database.Prefix, tn)
}

func CheckDb() bool {
if db != nil {
return true
}
return false
if db != nil {
return true
}
return false
}
4 changes: 2 additions & 2 deletions internal/db/mail.go
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ func MailDeleteById(id int64, status int64) bool {
return true
}

//用过ID获取邮件的全部信息
// 用过ID获取邮件的全部信息
func MailById(id int64) (Mail, error) {
var m Mail
result := db.Model(&Mail{}).Where("id=?", id).Take(&m)
Expand All @@ -293,7 +293,7 @@ func MailSoftDeleteByIds(ids []int64) bool {
return true
}

//TODO:批量硬删除邮件数据
// TODO:批量硬删除邮件数据
func MailHardDeleteByIds(ids []int64) bool {
for _, id := range ids {

Expand Down
8 changes: 6 additions & 2 deletions internal/rspamd/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,9 @@ func Test_IsAlreadyLearnedError(t *testing.T) {
transport.Reset()
transport.RegisterResponder(http.MethodPost, "/learnspam", func(req *http.Request) (*http.Response, error) {
_, _ = ioutil.ReadAll(req.Body)
return httpmock.NewJsonResponse(208, struct{ ErrorField string `json:"error"` }{ ErrorField: "<EmailId> has been already learned as spam, ignore it" })
return httpmock.NewJsonResponse(208, struct {
ErrorField string `json:"error"`
}{ErrorField: "<EmailId> has been already learned as spam, ignore it"})
})

resp, err := client.LearnSpam(context.Background(), e6)
Expand All @@ -129,7 +131,9 @@ func Test_IsAlreadyLearnedError(t *testing.T) {
transport.Reset()
transport.RegisterResponder(http.MethodPost, "/learnspam", func(req *http.Request) (*http.Response, error) {
_, _ = ioutil.ReadAll(req.Body)
return httpmock.NewJsonResponse(400, struct{ ErrorField string `json:"error"` }{ ErrorField: "error" })
return httpmock.NewJsonResponse(400, struct {
ErrorField string `json:"error"`
}{ErrorField: "error"})
})

resp, err := client.LearnSpam(context.Background(), e7)
Expand Down
Loading

0 comments on commit 09f3374

Please sign in to comment.