Files
proton-bridge/internal/services/userevents/eventid_store.go
2025-01-02 14:03:49 +01:00

76 lines
2.0 KiB
Go

// Copyright (c) 2025 Proton AG
//
// This file is part of Proton Mail Bridge.
//
// Proton Mail Bridge is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Proton Mail Bridge is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Proton Mail Bridge. If not, see <https://www.gnu.org/licenses/>.
package userevents
import (
"context"
"sync"
"github.com/ProtonMail/proton-bridge/v3/internal/vault"
)
// EventIDStore exposes behavior expected of a type which allows us to store and retrieve event Ids.
// Note: this may be accessed from multiple go-routines.
type EventIDStore interface {
// Load the last stored event, return "" for empty.
Load(ctx context.Context) (string, error)
// Store the new id.
Store(ctx context.Context, id string) error
}
type InMemoryEventIDStore struct {
lock sync.Mutex
id string
}
func NewInMemoryEventIDStore() *InMemoryEventIDStore {
return &InMemoryEventIDStore{}
}
func (i *InMemoryEventIDStore) Load(_ context.Context) (string, error) {
i.lock.Lock()
defer i.lock.Unlock()
return i.id, nil
}
func (i *InMemoryEventIDStore) Store(_ context.Context, id string) error {
i.lock.Lock()
defer i.lock.Unlock()
i.id = id
return nil
}
type VaultEventIDStore struct {
vault *vault.User
}
func NewVaultEventIDStore(vault *vault.User) *VaultEventIDStore {
return &VaultEventIDStore{vault: vault}
}
func (v VaultEventIDStore) Load(_ context.Context) (string, error) {
return v.vault.EventID(), nil
}
func (v VaultEventIDStore) Store(_ context.Context, id string) error {
return v.vault.SetEventID(id)
}