mirror of
https://github.com/Crazyco-xyz/48hr.email.git
synced 2026-01-09 11:19:36 +01:00
Adds UX debug mode while mocking the imap server and other critical parts of the service simply to test UI elements for faster development
125 lines
3.4 KiB
JavaScript
125 lines
3.4 KiB
JavaScript
/**
|
|
* Mock Inbox Lock for UX Debug Mode
|
|
* Provides dummy inbox locking without database
|
|
*/
|
|
|
|
const debug = require('debug')('48hr-email:mock-inbox-lock')
|
|
|
|
class MockInboxLock {
|
|
constructor(mockUserRepository) {
|
|
this.mockUserRepository = mockUserRepository
|
|
this.locks = new Map()
|
|
|
|
// Initialize locks from repository
|
|
this._initializeLocks()
|
|
|
|
debug(`Mock locked inboxes: ${Array.from(mockUserRepository.lockedInboxes).join(', ')}`)
|
|
}
|
|
|
|
_initializeLocks() {
|
|
// Add the mock locked inboxes from the repository
|
|
for (const address of this.mockUserRepository.lockedInboxes) {
|
|
this.locks.set(address.toLowerCase(), {
|
|
userId: 1,
|
|
address: address.toLowerCase(),
|
|
lockedAt: Date.now(),
|
|
lastAccess: Date.now()
|
|
})
|
|
}
|
|
}
|
|
|
|
// Reset to initial state (called when repository resets)
|
|
reset() {
|
|
this.locks.clear()
|
|
this._initializeLocks()
|
|
debug('Mock inbox locks reset to initial state')
|
|
}
|
|
|
|
isLocked(address) {
|
|
return this.locks.has(address.toLowerCase())
|
|
}
|
|
|
|
hasAccess(userId, address) {
|
|
const lock = this.locks.get(address.toLowerCase())
|
|
if (!lock) return true // Not locked
|
|
return lock.userId === userId
|
|
}
|
|
|
|
isLockedByUser(address, userId) {
|
|
const lock = this.locks.get(address.toLowerCase())
|
|
if (!lock) return false
|
|
return lock.userId === userId
|
|
}
|
|
|
|
lock(userId, address) {
|
|
const normalizedAddress = address.toLowerCase()
|
|
if (this.locks.has(normalizedAddress)) {
|
|
throw new Error('Inbox is already locked')
|
|
}
|
|
|
|
this.locks.set(normalizedAddress, {
|
|
userId,
|
|
address: normalizedAddress,
|
|
lockedAt: Date.now(),
|
|
lastAccess: Date.now()
|
|
})
|
|
|
|
this.mockUserRepository.lockedInboxes.add(address)
|
|
debug(`Locked inbox: ${normalizedAddress}`)
|
|
return true
|
|
}
|
|
|
|
release(userId, address) {
|
|
const normalizedAddress = address.toLowerCase()
|
|
const lock = this.locks.get(normalizedAddress)
|
|
|
|
if (!lock) {
|
|
throw new Error('Inbox is not locked')
|
|
}
|
|
|
|
if (lock.userId !== userId) {
|
|
throw new Error('You do not own this lock')
|
|
}
|
|
|
|
this.locks.delete(normalizedAddress)
|
|
this.mockUserRepository.lockedInboxes.delete(address)
|
|
debug(`Released lock on ${normalizedAddress}`)
|
|
return true
|
|
}
|
|
|
|
updateAccess(userId, address) {
|
|
const lock = this.locks.get(address.toLowerCase())
|
|
if (lock && lock.userId === userId) {
|
|
lock.lastAccess = Date.now()
|
|
}
|
|
}
|
|
|
|
getUserLockedInboxes(userId) {
|
|
const userLocks = []
|
|
for (const [address, lock] of this.locks.entries()) {
|
|
if (lock.userId === userId) {
|
|
userLocks.push({
|
|
address: address,
|
|
locked_at: lock.lockedAt,
|
|
last_access: lock.lastAccess
|
|
})
|
|
}
|
|
}
|
|
return userLocks
|
|
}
|
|
|
|
getInactive(hours) {
|
|
// Mock - return empty array
|
|
return []
|
|
}
|
|
|
|
getUserLockCount(userId) {
|
|
let count = 0
|
|
for (const lock of this.locks.values()) {
|
|
if (lock.userId === userId) count++
|
|
}
|
|
return count
|
|
}
|
|
}
|
|
|
|
module.exports = MockInboxLock
|