GODT-1351: Cache and update of space bytes in user object.

This commit is contained in:
Jakub
2021-09-21 14:54:15 +02:00
parent 41e15db442
commit 2899e7bb15
27 changed files with 243 additions and 49 deletions

View File

@ -337,6 +337,11 @@ func (loop *eventLoop) processEvent(event *pmapi.Event) (err error) {
}
}
if event.User != nil {
loop.user.UpdateSpace(event.User)
loop.listener.Emit(bridgeEvents.UserRefreshEvent, loop.user.ID())
}
// One would expect that every event would contain MessageCount as part of
// the event.Messages, but this is apparently not the case.
// MessageCounts are served on an irregular basis, so we should update and

View File

@ -207,6 +207,18 @@ func (mr *MockBridgeUserMockRecorder) Logout() *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Logout", reflect.TypeOf((*MockBridgeUser)(nil).Logout))
}
// UpdateSpace mocks base method.
func (m *MockBridgeUser) UpdateSpace(arg0 *pmapi.User) {
m.ctrl.T.Helper()
m.ctrl.Call(m, "UpdateSpace", arg0)
}
// UpdateSpace indicates an expected call of UpdateSpace.
func (mr *MockBridgeUserMockRecorder) UpdateSpace(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSpace", reflect.TypeOf((*MockBridgeUser)(nil).UpdateSpace), arg0)
}
// UpdateUser mocks base method.
func (m *MockBridgeUser) UpdateUser(arg0 context.Context) error {
m.ctrl.T.Helper()

View File

@ -37,6 +37,7 @@ type BridgeUser interface {
GetStoreAddresses() []string
GetClient() pmapi.Client
UpdateUser(context.Context) error
UpdateSpace(*pmapi.User)
CloseAllConnections()
CloseConnection(string)
Logout() error

View File

@ -17,18 +17,47 @@
package store
import "math"
// UserID returns user ID.
func (store *Store) UserID() string {
return store.user.ID()
}
// GetSpace returns used and total space in bytes.
func (store *Store) GetSpace() (usedSpace, maxSpace uint, err error) {
// GetSpaceKB returns used and total space in kilo bytes (needed for IMAP
// Quota. Quota is "in units of 1024 octets" (or KB) and PM returns bytes.
func (store *Store) GetSpaceKB() (usedSpace, maxSpace uint32, err error) {
apiUser, err := store.client().CurrentUser(exposeContextForIMAP())
if err != nil {
return 0, 0, err
}
return uint(apiUser.UsedSpace), uint(apiUser.MaxSpace), nil
if apiUser.UsedSpace != nil {
usedSpace = store.toKBandLimit(*apiUser.UsedSpace, usedSpaceType)
}
if apiUser.MaxSpace != nil {
maxSpace = store.toKBandLimit(*apiUser.MaxSpace, maxSpaceType)
}
return
}
type spaceType string
const (
usedSpaceType = spaceType("used")
maxSpaceType = spaceType("max")
)
func (store *Store) toKBandLimit(n int64, space spaceType) uint32 {
if n < 0 {
log.WithField("space", space).Warning("negative number of bytes")
return uint32(0)
}
n /= 1024
if n > math.MaxUint32 {
log.WithField("space", space).Warning("too large number of bytes")
return uint32(math.MaxUint32)
}
return uint32(n)
}
// GetMaxUpload returns max size of message + all attachments in bytes.