Add Mailserver Request Gaps service (#1596)

This commits add some endpoints to store mailserver request gaps,
and provides 4 endpoints:

```
AddMailserverRequestGaps(gaps []MailserverRequestGap) error
GetMailserverRequestGaps(chatID string) []MailserverRequestGap
DeleteMailserverRequestGaps(ids []string) error
DeleteMailserverRequestGapsByChatID(id string) error
```
This commit is contained in:
Andrea Maria Piana 2019-09-04 12:04:17 +02:00 committed by GitHub
parent d7f454fe4c
commit b27779aa4e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 233 additions and 31 deletions

View File

@ -171,7 +171,7 @@ setup-build: lint-install release-install gomobile-install ##@other Prepare proj
setup: setup-build setup-dev tidy ##@other Prepare project for development and building
generate: ##@other Regenerate assets and other auto-generated stuff
go generate ./static ./static/chat_db_migrations ./static/mailserver_db_migrations ./t
go generate ./static ./static/mailserver_db_migrations ./t
prepare-release: clean-release
mkdir -p $(RELEASE_DIR)

View File

@ -1,7 +1,7 @@
// Code generated by go-bindata. DO NOT EDIT.
// sources:
// 0001_app.down.sql (230B)
// 0001_app.up.sql (2.246kB)
// 0001_app.down.sql (314B)
// 0001_app.up.sql (2.528kB)
// doc.go (74B)
package migrations
@ -71,7 +71,7 @@ func (fi bindataFileInfo) Sys() interface{} {
return nil
}
var __0001_appDownSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x72\x09\xf2\x0f\x50\x08\x71\x74\xf2\x71\x55\x28\x4e\x2d\x29\xc9\xcc\x4b\x2f\xb6\xe6\x42\x12\x4c\x4c\x4e\xce\x2f\xcd\x2b\x41\x15\x4c\x2a\xca\x2f\x2f\x4e\x2d\xc2\x2e\x18\x9f\x91\x59\x5c\x92\x5f\x54\x89\x22\x99\x92\x58\x50\x80\xaa\xbc\x20\xb5\x28\x37\xb3\xb8\x38\x33\x3f\x0f\x55\xbc\xa4\x28\x31\xaf\x38\x0d\xc3\xf0\x9c\xfc\xe4\x6c\xec\x2e\x8b\x2f\xc9\x8f\xc7\x22\x9d\x9b\x98\x99\x53\x9c\x5a\x54\x06\x36\x09\x10\x00\x00\xff\xff\xd2\xa8\x66\x23\xe6\x00\x00\x00")
var __0001_appDownSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\xce\xbf\x0e\x82\x40\x0c\xc7\xf1\x9d\xa7\xe0\x3d\x98\x34\x30\x98\x18\x35\xc6\xc1\xad\xa9\x47\x85\x46\xb8\x9e\x6d\xf1\xcf\xdb\x3b\xca\x45\x5c\x3f\xfd\xe5\x9b\xd6\xc7\xfd\xa1\x3c\xad\xd6\xdb\xa6\x34\x72\xe7\xd8\x59\x55\xcc\x10\x43\x90\x29\x7a\x8e\x17\x95\xa7\x91\x2e\x23\xf4\x6c\x2e\xfa\xce\x8e\x2d\xa6\x94\xcf\x13\xe9\xc8\x66\x2c\x31\x77\x57\x8c\x76\xfd\x89\x0f\x12\x6e\xcb\x9f\x81\x0b\x2c\x9c\x47\xe4\xc1\x48\x1f\xdf\xd2\x66\x57\x37\xe7\x99\x83\xd2\x7d\x22\x73\xe8\x30\x19\x84\x1e\x1d\xb8\x05\x6e\x5f\x7f\x3a\xd9\xbe\x2a\x3e\x01\x00\x00\xff\xff\x07\x9e\x75\xc1\x3a\x01\x00\x00")
func _0001_appDownSqlBytes() ([]byte, error) {
return bindataRead(
@ -86,12 +86,12 @@ func _0001_appDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "0001_app.down.sql", size: 230, mode: os.FileMode(0644), modTime: time.Unix(1567452784, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc6, 0x64, 0x5c, 0xd5, 0x35, 0x13, 0xe3, 0x6e, 0x9c, 0x61, 0x16, 0x4, 0x5d, 0x61, 0x79, 0xb2, 0xfd, 0x44, 0xa3, 0x6a, 0x1d, 0x8e, 0xd9, 0x50, 0x92, 0x2e, 0x34, 0xb2, 0x6, 0x3, 0xb7, 0xf1}}
info := bindataFileInfo{name: "0001_app.down.sql", size: 314, mode: os.FileMode(0644), modTime: time.Unix(1567586064, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x86, 0x70, 0x13, 0xfb, 0x14, 0x28, 0x91, 0x3f, 0x97, 0x54, 0x9b, 0xab, 0x17, 0xb0, 0xdd, 0x3c, 0xa9, 0x40, 0x72, 0x45, 0xec, 0xf6, 0x16, 0x47, 0xbc, 0xd2, 0x30, 0x5d, 0x14, 0x0, 0x50, 0x19}}
return a, nil
}
var __0001_appUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x55\xdd\x92\xa2\x3c\x10\xbd\xcf\x53\xf4\xa5\x56\xf1\x06\x73\x85\x1a\x1d\xea\xe3\x0b\xbb\xfc\xec\xcc\x5c\x51\x11\xa2\x52\xf2\xb7\x49\x1c\xc7\xb7\xdf\x0a\x21\x80\x23\xe2\x5a\x7b\x47\xd2\xdd\xc7\x73\x4e\xba\xdb\xa5\x8f\xed\x10\x43\x68\x2f\x5c\x0c\xce\x1a\x88\x17\x02\x7e\x77\x82\x30\x00\xc1\xa4\xcc\xca\xbd\x80\x19\x92\x97\x9a\xc1\x2f\xdb\x5f\xbe\xda\x3e\xfc\xf0\x9d\xff\x6d\xff\x03\xfe\xc3\x1f\x16\xfa\xa4\xf9\x89\xc1\xc2\xf5\x16\x68\x0e\x6f\x4e\xf8\xea\x45\x21\xf8\xde\x9b\xb3\x7a\x41\x68\x02\x9c\x26\x49\x75\x2a\xa5\x02\xa7\x69\xca\x99\x10\xe3\xf8\x67\x9a\xe7\x4c\xc2\xc2\xf3\x5c\x6c\x13\x0b\x25\x07\x3a\x38\x35\xbc\x42\xfc\x1e\x5a\x48\xc8\x8a\xd3\xbd\x39\xd5\xa7\xed\x91\x5d\x1a\x5e\x16\xaa\xa9\x3c\xb4\xf7\x25\x2d\x4c\x4a\x52\xe5\x15\x6f\xbe\xef\x33\x8f\x88\xf3\x33\xc2\xe0\x90\x15\x7e\x87\x53\x99\xfd\x3e\xb1\x58\x33\x8a\x0d\x6b\x8f\x0c\xb4\xe8\xd8\x1c\xde\x5e\xb1\x8f\xbb\xe3\xcb\x14\x9c\x12\x34\x0e\xa6\x22\x1d\x54\x73\x98\xb6\x74\xcb\xab\xb3\x60\x5c\x59\x9a\xa5\x8d\xb0\x6b\x2b\x3b\xed\x4d\x11\x89\x5c\xd7\x42\x32\x2b\x98\x90\xb4\xa8\x21\x0a\x36\xce\x86\xe0\x15\x2c\x9c\x8d\x43\x42\x0b\xa5\xb4\xae\x8d\xd3\xb0\xc2\x6b\x3b\x72\x43\xd8\xd1\x5c\x30\x0b\x1d\x32\x65\xf7\xc5\x29\x53\xf6\x05\x11\x09\x74\xa5\x43\x26\xac\x9c\x62\x1c\xb7\x78\x30\x43\xed\x55\x6c\x14\xf4\x54\x4d\x8e\x7e\xbd\xb5\xe7\x63\x67\x43\x94\xb2\x59\x5f\x33\x07\x1f\xaf\xb1\x8f\xc9\x12\xf7\xe8\x33\x75\xef\x29\x0d\x2e\x0e\x31\x2c\xed\x60\x69\xaf\x30\x7a\xe0\xa6\x92\xaf\xac\xec\x5d\x1b\x98\xf9\x9c\xcc\x9a\xf1\x22\x13\x22\xab\x4a\x05\xa8\x80\xe3\xb1\xb7\xe8\xd3\xbe\x47\x86\x62\xbb\xf2\x2b\xad\x0d\xdb\x99\xbe\x1e\x97\x3a\x45\x50\x72\x5a\x8a\x9d\x6e\x9d\x92\xc9\x73\xc5\x8f\xea\x01\xba\x87\xd5\x2d\x31\x7c\x0b\x2a\x0e\xdd\xbc\xf6\xd7\xdf\x27\xb9\x8f\x6c\xf3\x63\x7c\xa7\x48\x7e\xb5\x63\x2a\x58\x99\x32\x3e\x92\xc1\x59\xc2\xb2\x5a\xb6\x69\x79\xb5\x6f\xbf\xae\xb6\xd2\xb8\x5b\xbd\x1a\xcb\x50\xb8\xee\x91\xbc\x4a\x8e\x62\x98\xa6\x53\x6e\x3c\xb4\xd0\xd2\x23\x41\xe8\xdb\xca\x88\x76\x74\x8d\x6d\x71\xcd\xb8\x19\xe1\xe6\xbb\x85\x33\xf3\x3e\x53\x98\x56\x9b\x60\xf5\xbf\x35\x7f\xd4\x83\x9a\xdd\x3f\x3e\x4a\x79\x2a\xb6\x8c\xdf\xa6\x0f\x46\xff\x3e\x24\xa3\x69\xb3\x03\xba\x05\xb0\xb6\xdd\x60\xd4\x8c\x86\xeb\xa8\xfa\xef\xe6\xde\x2d\xd6\x4c\x1f\x61\xe8\xac\x87\xde\x99\x3d\x1a\xcb\x2a\x7e\xce\xc7\xe9\x2e\xbe\x67\xa7\xb8\x94\x09\x34\x8b\x73\xa2\xff\x5a\xee\xd3\x1d\x68\x92\xfe\xaa\x07\x0b\x5a\xd7\x59\xb9\x8f\x77\x15\x8f\x5b\xc9\x9d\xe2\x51\x27\x4d\x1b\xf6\x74\x9e\xe9\xc8\x82\x66\xb9\x60\xfc\x53\xef\x0a\x00\x80\x2c\x1d\xff\xe3\x56\xb1\x66\xcb\xdd\xda\xa8\x42\xf7\x4d\x56\xd1\x9a\x0a\x71\xae\x78\x07\xad\x6f\x77\x39\x63\xf2\xa6\x42\x51\xfe\x13\x00\x00\xff\xff\xe9\x5c\xa2\xa8\xc6\x08\x00\x00")
var __0001_appUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x56\xdf\x72\xba\x38\x18\xbd\xcf\x53\x7c\x97\x3a\xc3\x1b\xf4\x0a\x35\x5a\x66\x59\xd8\x45\xdc\xb6\x57\x99\x28\x51\x19\x81\xa4\x49\xac\xf5\xed\x77\x42\xf8\xa7\x02\xb6\xf3\xbb\x23\xc9\xc9\xf1\x9c\x93\x2f\x5f\x9c\x47\xd8\x8d\x31\xc4\xee\xcc\xc7\xe0\x2d\x21\x08\x63\xc0\xef\xde\x3a\x5e\x83\x62\x5a\xa7\xc5\x41\xc1\x04\xe9\xab\x60\xf0\x9f\x1b\xcd\x5f\xdd\x08\xfe\x89\xbc\xbf\xdd\xe8\x03\xfe\xc2\x1f\x0e\xfa\xa2\xd9\x99\xc1\xcc\x0f\x67\x68\x0a\x6f\x5e\xfc\x1a\x6e\x62\x88\xc2\x37\x6f\xf1\x82\xd0\x08\x39\xdd\xed\xf8\xb9\xd0\x86\x9c\x26\x89\x64\x4a\xf5\xf3\x5f\x68\x96\x31\x0d\xb3\x30\xf4\xb1\x1b\x38\x68\x77\xa4\x9d\x51\xa9\x2b\xc6\xef\xb1\x83\x94\xe6\x92\x1e\xea\x91\x38\x6f\x4f\xec\x5a\xea\x72\x90\xa0\xfa\x58\xcd\x17\x34\xaf\x21\x3b\x9e\x71\x59\x7e\x0f\x2b\xdf\x04\xde\xbf\x1b\x0c\x5e\xb0\xc0\xef\x70\x2e\xd2\xcf\x33\x23\x56\x11\xa9\x55\x87\x41\xc7\x8b\x5d\x9b\xc2\xdb\x2b\x8e\x70\x33\x7c\x19\xa3\x33\x86\xfa\xc9\xcc\x4a\x43\x55\x0e\xc6\x23\xdd\x4a\x7e\x51\x4c\x9a\x48\xd3\xa4\x34\x76\x1b\x65\xe3\xbd\xdc\x14\x6c\x7c\xdf\x41\x3a\xcd\x99\xd2\x34\x17\xb0\x59\xaf\xbc\x55\x80\x17\x30\xf3\x56\x5e\x10\x3b\x28\xa1\x42\xd4\x49\xc3\x02\x2f\xdd\x8d\x1f\xc3\x9e\x66\x8a\x39\xe8\x98\x9a\xb8\xaf\x5e\x91\xb0\x6f\xd8\x04\x6b\xbb\xd3\x0b\x46\xa2\x1c\x53\x4c\x2a\x3e\x98\xa0\x6a\x8a\xd4\x0e\x5a\xa9\x35\xc6\x9e\xde\x32\x8c\xb0\xb7\x0a\x8c\xb3\x49\xbb\x67\x0a\x11\x5e\xe2\x08\x07\x73\xdc\xb2\x4f\xcc\x7c\x68\x3c\xf8\x38\xc6\x30\x77\xd7\x73\x77\x81\xd1\x93\x34\x8d\x7d\x13\x65\x9b\x5a\x27\xcc\xdf\xd9\x14\x4c\xe6\xa9\x52\x29\x2f\x0c\xa1\x21\x26\x7d\x67\xd1\xc2\xee\x57\xba\x66\x9b\xed\x37\x5e\x4b\xb5\x13\x3b\xdd\x6f\x75\x4c\xa0\x96\xb4\x50\x7b\x5b\x3a\x05\xd3\x17\x2e\x4f\xe6\x00\x9a\x83\xb5\x25\xd1\x3d\x0b\xaa\x8e\xcd\x7d\x6d\xa7\xef\x6f\x72\xbb\xb2\xcd\x4e\x64\x60\x93\xfe\xae\xae\xa9\x62\x45\xc2\x64\x0f\x42\xb2\x1d\x4b\x85\xae\x60\x19\x3f\x54\x5f\x37\x5d\xa9\x3f\xad\xd6\x8d\x53\x4b\xb8\xad\x91\x8c\xef\x4e\xaa\x0b\xb3\x90\x87\x0c\x1d\x34\x0f\x83\x75\x1c\xb9\x26\x88\xea\xea\xd6\xb1\x11\xc1\x64\x7d\x85\xcb\xef\x8a\xae\xbe\xef\x13\xc3\xe9\x54\x00\xa7\xfd\xad\xe9\xb3\x1a\xb4\xea\xfe\xf0\x50\x8a\x73\xbe\x65\xf2\x11\xde\xb9\xfa\xc3\x94\x8c\x26\x65\x0f\x68\x1a\xc0\xd2\xf5\xd7\xbd\x61\x94\x5a\x7b\xdd\xdf\x87\x3b\xb8\xd9\x2a\x7d\xc6\x61\x51\x4f\xb3\xab\xfb\x28\xd1\x9c\xfc\x2e\xc7\xf1\x2a\x1e\x8a\x53\x5d\x8b\x1d\x94\x8d\x73\xa4\xfe\x2a\xed\xe3\x15\x58\x83\x7e\x54\x83\x39\x15\x22\x2d\x0e\x64\xcf\x25\xa9\x2c\x37\x8e\x7b\x93\xac\xcb\xb0\x95\xf3\x9b\x8a\xcc\x69\x9a\x29\x26\xbf\x6c\xaf\x00\x00\x48\x93\xfe\x87\xdb\xac\x95\x5d\xee\x31\x46\xb3\x34\x1c\xb2\x59\x15\x54\xa9\x0b\x97\x0d\xb5\x9d\xdd\x67\x8c\xe9\x87\x1d\x3f\x97\x4c\x24\xfb\x3c\x33\xa5\xc9\x81\x0a\x2b\xff\x40\x05\xd9\x4b\x9e\xdf\xbc\x61\x78\x85\x6f\xf5\x18\x94\xe6\xe3\x98\xde\x17\x17\xa0\x7c\xdd\xef\xdf\x32\x04\x30\xf8\x7e\xd8\xff\x06\x03\x9a\x49\x45\x47\xd2\xe4\xdb\x94\xc7\xa0\xb5\x0a\x37\x7d\x41\xff\x07\x00\x00\xff\xff\x84\xe7\x47\xce\xe0\x09\x00\x00")
func _0001_appUpSqlBytes() ([]byte, error) {
return bindataRead(
@ -106,8 +106,8 @@ func _0001_appUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "0001_app.up.sql", size: 2246, mode: os.FileMode(0644), modTime: time.Unix(1567452763, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6e, 0xc4, 0x4d, 0x62, 0x9b, 0x4, 0x4e, 0xb1, 0x57, 0x51, 0x5c, 0xf7, 0x9, 0x9, 0x30, 0x38, 0x10, 0x1f, 0xc1, 0xcc, 0xe4, 0x56, 0x67, 0xa, 0x17, 0x3b, 0x51, 0x1f, 0x84, 0x12, 0xf4, 0x15}}
info := bindataFileInfo{name: "0001_app.up.sql", size: 2528, mode: os.FileMode(0644), modTime: time.Unix(1567586073, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x54, 0xe5, 0x59, 0x10, 0xba, 0x9c, 0x1b, 0xb7, 0x11, 0x7a, 0x4d, 0xe4, 0x4c, 0xc3, 0x8f, 0xab, 0x5, 0x1b, 0xcc, 0x80, 0x4a, 0xea, 0x35, 0xbd, 0x13, 0xed, 0xe1, 0x92, 0xd9, 0x25, 0xf3, 0xa9}}
return a, nil
}
@ -126,7 +126,7 @@ func docGo() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "doc.go", size: 74, mode: os.FileMode(0644), modTime: time.Unix(1566753968, 0)}
info := bindataFileInfo{name: "doc.go", size: 74, mode: os.FileMode(0644), modTime: time.Unix(1566455715, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xde, 0x7c, 0x28, 0xcd, 0x47, 0xf2, 0xfa, 0x7c, 0x51, 0x2d, 0xd8, 0x38, 0xb, 0xb0, 0x34, 0x9d, 0x4c, 0x62, 0xa, 0x9e, 0x28, 0xc3, 0x31, 0x23, 0xd9, 0xbb, 0x89, 0x9f, 0xa0, 0x89, 0x1f, 0xe8}}
return a, nil
}

View File

@ -8,3 +8,5 @@ DROP TABLE transfers;
DROP TABLE blocks;
DROP TABLE accounts_to_blocks;
DROP TABLE mailservers;
DROP INDEX mailserver_request_gaps_chat_id_idx;
DROP TABLE mailserver_request_gaps;

View File

@ -83,3 +83,12 @@ CREATE TABLE IF NOT EXISTS mailservers (
password VARCHAR,
fleet VARCHAR NOT NULL
);
CREATE TABLE IF NOT EXISTS mailserver_request_gaps (
gap_from UNSIGNED INTEGER NOT NULL,
gap_to UNSIGNED INTEGER NOT NULL,
id TEXT PRIMARY KEY,
chat_id TEXT NOT NULL
) WITHOUT ROWID;
CREATE INDEX mailserver_request_gaps_chat_id_idx ON mailserver_request_gaps (chat_id);

View File

@ -86,7 +86,7 @@ func _1557732988_initialize_dbDownSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1557732988_initialize_db.down.sql", size: 72, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "1557732988_initialize_db.down.sql", size: 72, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x77, 0x40, 0x78, 0xb7, 0x71, 0x3c, 0x20, 0x3b, 0xc9, 0xb, 0x2f, 0x49, 0xe4, 0xff, 0x1c, 0x84, 0x54, 0xa1, 0x30, 0xe3, 0x90, 0xf8, 0x73, 0xda, 0xb0, 0x2a, 0xea, 0x8e, 0xf1, 0x82, 0xe7, 0xd2}}
return a, nil
}
@ -106,7 +106,7 @@ func _1557732988_initialize_dbUpSql() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "1557732988_initialize_db.up.sql", size: 234, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "1557732988_initialize_db.up.sql", size: 234, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8f, 0xa, 0x31, 0xf, 0x94, 0xe, 0xd7, 0xd6, 0xaa, 0x22, 0xd6, 0x6c, 0x7a, 0xbc, 0xad, 0x6a, 0xed, 0x2e, 0x7a, 0xf0, 0x24, 0x81, 0x87, 0x14, 0xe, 0x1c, 0x8a, 0xf1, 0x45, 0xaf, 0x9e, 0x85}}
return a, nil
}
@ -126,7 +126,7 @@ func staticGo() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "static.go", size: 178, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "static.go", size: 178, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xab, 0x8a, 0xf4, 0x27, 0x24, 0x9d, 0x2a, 0x1, 0x7b, 0x54, 0xea, 0xae, 0x4a, 0x35, 0x40, 0x92, 0xb5, 0xf9, 0xb3, 0x54, 0x3e, 0x3a, 0x1a, 0x2b, 0xae, 0xfb, 0x9e, 0x82, 0xeb, 0x4c, 0xf, 0x6}}
return a, nil
}

View File

@ -43,3 +43,39 @@ Reads all saved mailservers.
#### mailservers_deleteMailserver
Deletes a mailserver specified by an ID.
## Mailserver requests gap service
Mailserver request gaps service provides read/write API for `MailserverRequestGap` object
which stores details about the gaps between mailserver requests.
API
---
The service exposes four methods
#### mailserverrequestgaps_addMailserverRequestGaps
Stores `MailserverRequestGap` in the database.
All fields are specified below:
```json
{
"id": "1",
"chatId": "chat-id",
"from": 1,
"to": 2
}
```
#### mailservers_getMailserverRequestGaps
Reads all saved mailserver request gaps by chatID.
#### mailservers_deleteMailserverRequestGaps
Deletes all MailserverRequestGaps specified by IDs.
#### mailservers_deleteMailserverRequestGapsByChatID
Deletes all MailserverRequestGaps specified by chatID.

View File

@ -22,3 +22,19 @@ func (a *API) GetMailservers(ctx context.Context) ([]Mailserver, error) {
func (a *API) DeleteMailserver(ctx context.Context, id string) error {
return a.db.Delete(id)
}
func (a *API) AddMailserverRequestGaps(ctx context.Context, gaps []MailserverRequestGap) error {
return a.db.AddGaps(gaps)
}
func (a *API) GetMailserverRequestGaps(ctx context.Context, chatID string) ([]MailserverRequestGap, error) {
return a.db.MailserverRequestGaps(chatID)
}
func (a *API) DeleteMailserverRequestGaps(ctx context.Context, ids []string) error {
return a.db.DeleteGaps(ids)
}
func (a *API) DeleteMailserverRequestGapsByChatID(ctx context.Context, chatID string) error {
return a.db.DeleteGapsByChatID(chatID)
}

View File

@ -54,3 +54,52 @@ func TestAddGetDeleteMailserver(t *testing.T) {
err = api.DeleteMailserver(context.Background(), "other-id")
require.NoError(t, err)
}
func TestAddGetDeleteMailserverRequestGap(t *testing.T) {
db, close := setupTestDB(t)
defer close()
chatID1 := "chat-id-1"
chatID2 := "chat-id-2"
api := &API{db: db}
gap1 := MailserverRequestGap{ID: "1", ChatID: chatID1, From: 1, To: 2}
gap2 := MailserverRequestGap{ID: "2", ChatID: chatID2, From: 1, To: 2}
gap3 := MailserverRequestGap{ID: "3", ChatID: chatID2, From: 1, To: 2}
gaps := []MailserverRequestGap{
gap1,
gap2,
gap3,
}
err := api.AddMailserverRequestGaps(context.Background(), gaps)
require.NoError(t, err)
actualGaps, err := api.GetMailserverRequestGaps(context.Background(), chatID1)
require.NoError(t, err)
require.EqualValues(t, []MailserverRequestGap{gap1}, actualGaps)
actualGaps, err = api.GetMailserverRequestGaps(context.Background(), chatID2)
require.NoError(t, err)
require.EqualValues(t, []MailserverRequestGap{gap2, gap3}, actualGaps)
err = api.DeleteMailserverRequestGaps(context.Background(), []string{gap1.ID, gap2.ID})
require.NoError(t, err)
// Verify it was deleted.
actualGaps, err = api.GetMailserverRequestGaps(context.Background(), chatID1)
require.NoError(t, err)
require.Len(t, actualGaps, 0)
actualGaps, err = api.GetMailserverRequestGaps(context.Background(), chatID2)
require.NoError(t, err)
require.Len(t, actualGaps, 1)
err = api.DeleteMailserverRequestGapsByChatID(context.Background(), chatID2)
require.NoError(t, err)
// Verify it was deleted.
actualGaps, err = api.GetMailserverRequestGaps(context.Background(), chatID2)
require.NoError(t, err)
require.Len(t, actualGaps, 0)
}

View File

@ -1,6 +1,10 @@
package mailservers
import "database/sql"
import (
"database/sql"
"fmt"
"strings"
)
type Mailserver struct {
ID string `json:"id"`
@ -10,6 +14,13 @@ type Mailserver struct {
Fleet string `json:"fleet"`
}
type MailserverRequestGap struct {
ID string `json:"id"`
ChatID string `json:"chatId"`
From uint64 `json:"from"`
To uint64 `json:"to"`
}
func (m Mailserver) nullablePassword() (val sql.NullString) {
if m.Password != "" {
val.String = m.Password
@ -80,3 +91,82 @@ func (d *Database) Delete(id string) error {
_, err := d.db.Exec(`DELETE FROM mailservers WHERE id = ?`, id)
return err
}
func (d *Database) AddGaps(gaps []MailserverRequestGap) error {
tx, err := d.db.Begin()
if err != nil {
return err
}
defer func() {
if err == nil {
err = tx.Commit()
return
}
_ = tx.Rollback()
}()
for _, gap := range gaps {
_, err := tx.Exec(`INSERT OR REPLACE INTO mailserver_request_gaps(
id,
chat_id,
gap_from,
gap_to
) VALUES (?, ?, ?, ?)`,
gap.ID,
gap.ChatID,
gap.From,
gap.To,
)
if err != nil {
return err
}
}
return nil
}
func (d *Database) MailserverRequestGaps(chatID string) ([]MailserverRequestGap, error) {
var result []MailserverRequestGap
rows, err := d.db.Query(`SELECT id, chat_id, gap_from, gap_to FROM mailserver_request_gaps WHERE chat_id = ?`, chatID)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var m MailserverRequestGap
if err := rows.Scan(
&m.ID,
&m.ChatID,
&m.From,
&m.To,
); err != nil {
return nil, err
}
result = append(result, m)
}
return result, nil
}
func (d *Database) DeleteGaps(ids []string) error {
if len(ids) == 0 {
return nil
}
inVector := strings.Repeat("?, ", len(ids)-1) + "?"
query := fmt.Sprintf(`DELETE FROM mailserver_request_gaps WHERE id IN (%s)`, inVector) // nolint: gosec
idsArgs := make([]interface{}, 0, len(ids))
for _, id := range ids {
idsArgs = append(idsArgs, id)
}
_, err := d.db.Exec(query, idsArgs...)
return err
}
func (d *Database) DeleteGapsByChatID(chatID string) error {
_, err := d.db.Exec(`DELETE FROM mailserver_request_gaps WHERE chat_id = ?`, chatID)
return err
}

View File

@ -97,7 +97,7 @@ func ConfigReadmeMd() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/README.md", size: 3330, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "../config/README.md", size: 3330, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x65, 0xb9, 0xf5, 0x6, 0xbe, 0x7d, 0x85, 0x3b, 0x8, 0xbc, 0x5c, 0x71, 0x85, 0x19, 0xd1, 0xde, 0x38, 0xb5, 0xe9, 0x90, 0x5c, 0x45, 0xb2, 0xa5, 0x8a, 0x91, 0xee, 0xeb, 0x1e, 0xb4, 0xa9, 0x8f}}
return a, nil
}
@ -117,7 +117,7 @@ func ConfigCliFleetEthBetaJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/fleet-eth.beta.json", size: 3261, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "../config/cli/fleet-eth.beta.json", size: 3261, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2b, 0xae, 0x42, 0x4b, 0xa4, 0xd9, 0x2, 0x69, 0x99, 0x29, 0x7e, 0x1, 0x4e, 0xd9, 0x58, 0x84, 0x28, 0x3a, 0x81, 0xc4, 0xde, 0x1d, 0xea, 0x51, 0xc8, 0x21, 0xff, 0x7b, 0xff, 0x23, 0x1c, 0x16}}
return a, nil
}
@ -137,7 +137,7 @@ func ConfigCliFleetEthStagingJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/fleet-eth.staging.json", size: 1862, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "../config/cli/fleet-eth.staging.json", size: 1862, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xae, 0x85, 0xa1, 0x10, 0x16, 0x87, 0x10, 0x1c, 0xc3, 0xf4, 0xc7, 0xc, 0x2e, 0x51, 0xb7, 0x3, 0x61, 0x16, 0x99, 0x84, 0x3d, 0x5d, 0x82, 0x62, 0xfb, 0xf4, 0x5e, 0x19, 0xda, 0xb9, 0xaa, 0xc4}}
return a, nil
}
@ -157,7 +157,7 @@ func ConfigCliFleetEthTestJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/fleet-eth.test.json", size: 1543, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "../config/cli/fleet-eth.test.json", size: 1543, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x68, 0xef, 0x71, 0xa1, 0x38, 0x37, 0xf0, 0x0, 0xbb, 0x95, 0x26, 0x2a, 0x2a, 0x65, 0x98, 0xfe, 0xe5, 0x3f, 0xbf, 0xb, 0x68, 0xa6, 0xb5, 0xa4, 0x10, 0xc1, 0x4b, 0x67, 0xb4, 0x4e, 0x32, 0xc0}}
return a, nil
}
@ -177,7 +177,7 @@ func ConfigCliLesEnabledJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/les-enabled.json", size: 58, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "../config/cli/les-enabled.json", size: 58, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7e, 0xee, 0x27, 0xa7, 0x74, 0xa0, 0x46, 0xa1, 0x41, 0xed, 0x4d, 0x16, 0x5b, 0xf3, 0xf0, 0x7c, 0xc8, 0x2f, 0x6f, 0x47, 0xa4, 0xbb, 0x5f, 0x43, 0x33, 0xd, 0x9, 0x9d, 0xea, 0x9e, 0x15, 0xee}}
return a, nil
}
@ -197,7 +197,7 @@ func ConfigCliMailserverEnabledJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/cli/mailserver-enabled.json", size: 176, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "../config/cli/mailserver-enabled.json", size: 176, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0xec, 0x81, 0x8b, 0x99, 0xb6, 0xdb, 0xc0, 0x8b, 0x46, 0x97, 0x96, 0xc7, 0x58, 0x30, 0x33, 0xef, 0x54, 0x25, 0x87, 0x7b, 0xb9, 0x94, 0x6b, 0x18, 0xa4, 0x5b, 0x58, 0x67, 0x7c, 0x44, 0xa6}}
return a, nil
}
@ -217,7 +217,7 @@ func ConfigStatusChainGenesisJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "../config/status-chain-genesis.json", size: 612, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "../config/status-chain-genesis.json", size: 612, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb, 0xf0, 0xc, 0x1, 0x95, 0x65, 0x6, 0x55, 0x48, 0x8f, 0x83, 0xa0, 0xb4, 0x81, 0xda, 0xad, 0x30, 0x6d, 0xb2, 0x78, 0x1b, 0x26, 0x4, 0x13, 0x12, 0x9, 0x6, 0xae, 0x3a, 0x2c, 0x1, 0x71}}
return a, nil
}
@ -237,7 +237,7 @@ func keysBootnodeKey() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "keys/bootnode.key", size: 65, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "keys/bootnode.key", size: 65, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x31, 0xcf, 0x27, 0xd4, 0x96, 0x2e, 0x32, 0xcd, 0x58, 0x96, 0x2a, 0xe5, 0x8c, 0xa0, 0xf1, 0x73, 0x1f, 0xd6, 0xd6, 0x8b, 0xb, 0x73, 0xd3, 0x2c, 0x84, 0x1a, 0x56, 0xa4, 0x74, 0xb6, 0x95, 0x20}}
return a, nil
}
@ -257,7 +257,7 @@ func keysFirebaseauthkey() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "keys/firebaseauthkey", size: 153, mode: os.FileMode(0644), modTime: time.Unix(1560062905, 0)}
info := bindataFileInfo{name: "keys/firebaseauthkey", size: 153, mode: os.FileMode(0644), modTime: time.Unix(1536843582, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe, 0x69, 0x23, 0x64, 0x7d, 0xf9, 0x14, 0x37, 0x6f, 0x2b, 0x1, 0xf0, 0xb0, 0xa4, 0xb2, 0xd0, 0x18, 0xcd, 0xf9, 0xeb, 0x57, 0xa3, 0xfd, 0x79, 0x25, 0xa7, 0x9c, 0x3, 0xce, 0x26, 0xec, 0xe1}}
return a, nil
}
@ -277,7 +277,7 @@ func keysTestAccount1StatusChainPk() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "keys/test-account1-status-chain.pk", size: 489, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "keys/test-account1-status-chain.pk", size: 489, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8f, 0xba, 0x35, 0x1, 0x2b, 0x9d, 0xad, 0xf0, 0x2d, 0x3c, 0x4d, 0x6, 0xb5, 0x22, 0x2, 0x47, 0xd4, 0x1c, 0xf4, 0x31, 0x2f, 0xb, 0x5b, 0x27, 0x5d, 0x43, 0x97, 0x58, 0x2d, 0xf0, 0xe1, 0xbe}}
return a, nil
}
@ -297,7 +297,7 @@ func keysTestAccount1Pk() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "keys/test-account1.pk", size: 491, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "keys/test-account1.pk", size: 491, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9, 0x43, 0xc2, 0xf4, 0x8c, 0xc6, 0x64, 0x25, 0x8c, 0x7, 0x8c, 0xa8, 0x89, 0x2b, 0x7b, 0x9b, 0x4f, 0x81, 0xcb, 0xce, 0x3d, 0xef, 0x82, 0x9c, 0x27, 0x27, 0xa9, 0xc5, 0x46, 0x70, 0x30, 0x38}}
return a, nil
}
@ -317,7 +317,7 @@ func keysTestAccount2StatusChainPk() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "keys/test-account2-status-chain.pk", size: 489, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "keys/test-account2-status-chain.pk", size: 489, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9, 0xf8, 0x5c, 0xe9, 0x92, 0x96, 0x2d, 0x88, 0x2b, 0x8e, 0x42, 0x3f, 0xa4, 0x93, 0x6c, 0xad, 0xe9, 0xc0, 0x1b, 0x8a, 0x8, 0x8c, 0x5e, 0x7a, 0x84, 0xa2, 0xf, 0x9f, 0x77, 0x58, 0x2c, 0x2c}}
return a, nil
}
@ -337,7 +337,7 @@ func keysTestAccount2Pk() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "keys/test-account2.pk", size: 491, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "keys/test-account2.pk", size: 491, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9f, 0x72, 0xd5, 0x95, 0x5c, 0x5a, 0x99, 0x9d, 0x2f, 0x21, 0x83, 0xd7, 0x10, 0x17, 0x4a, 0x3d, 0x65, 0xc9, 0x26, 0x1a, 0x2c, 0x9d, 0x65, 0x63, 0xd2, 0xa0, 0xfc, 0x7c, 0x0, 0x87, 0x38, 0x9f}}
return a, nil
}
@ -357,7 +357,7 @@ func keysTestAccount3BeforeEip55Pk() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "keys/test-account3-before-eip55.pk", size: 489, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "keys/test-account3-before-eip55.pk", size: 489, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x81, 0x40, 0x56, 0xc1, 0x5e, 0x10, 0x6e, 0x28, 0x15, 0x3, 0x4e, 0xc4, 0xc4, 0x71, 0x4d, 0x16, 0x99, 0xcc, 0x1b, 0x63, 0xee, 0x10, 0x20, 0xe4, 0x59, 0x52, 0x3f, 0xc0, 0xad, 0x15, 0x13, 0x72}}
return a, nil
}

View File

@ -86,7 +86,7 @@ func configPublicChainAccountsJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "config/public-chain-accounts.json", size: 307, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "config/public-chain-accounts.json", size: 307, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x76, 0x5d, 0xc0, 0xfe, 0x57, 0x50, 0x18, 0xec, 0x2d, 0x61, 0x1b, 0xa9, 0x81, 0x11, 0x5f, 0x77, 0xf7, 0xb6, 0x67, 0x82, 0x1, 0x40, 0x68, 0x9d, 0xc5, 0x41, 0xaf, 0xce, 0x43, 0x81, 0x92, 0x96}}
return a, nil
}
@ -106,7 +106,7 @@ func configStatusChainAccountsJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "config/status-chain-accounts.json", size: 543, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "config/status-chain-accounts.json", size: 543, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8e, 0xb3, 0x61, 0x51, 0x70, 0x3c, 0x12, 0x3e, 0xf1, 0x1c, 0x81, 0xfb, 0x9a, 0x7c, 0xe3, 0x63, 0xd0, 0x8f, 0x12, 0xc5, 0x2d, 0xf4, 0xea, 0x27, 0x33, 0xef, 0xca, 0xf9, 0x3f, 0x72, 0x44, 0xbf}}
return a, nil
}
@ -126,7 +126,7 @@ func configTestDataJson() (*asset, error) {
return nil, err
}
info := bindataFileInfo{name: "config/test-data.json", size: 84, mode: os.FileMode(0644), modTime: time.Unix(1566753958, 0)}
info := bindataFileInfo{name: "config/test-data.json", size: 84, mode: os.FileMode(0644), modTime: time.Unix(1564144050, 0)}
a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xce, 0x9d, 0x80, 0xf5, 0x87, 0xfa, 0x57, 0x1d, 0xa1, 0xd5, 0x7a, 0x10, 0x3, 0xac, 0xd7, 0xf4, 0x64, 0x32, 0x96, 0x2b, 0xb7, 0x21, 0xb7, 0xa6, 0x80, 0x40, 0xe9, 0x65, 0xe3, 0xd6, 0xbd, 0x40}}
return a, nil
}