mock-auth.ts 2.95 KB
interface MockAuthUserRecord {
  id: number
  username: string
  password: string
  name: string
  email: string
  roles: string[]
  station: string
  avatar: {
    src: string
    alt: string
  }
}

interface MockTokenSession {
  token: string
  username: string
  expiresAt: number
}

export interface PublicAuthUser {
  id: number
  username: string
  name: string
  email: string
  roles: string[]
  station: string
  avatar: {
    src: string
    alt: string
  }
}

const SESSION_TTL_MS = 8 * 60 * 60 * 1000

const mockUsers: MockAuthUserRecord[] = [{
  id: 1001,
  username: 'admin',
  password: '123456',
  name: '系统管理员',
  email: 'admin@robot.local',
  roles: ['admin', 'qa_manager'],
  station: '总控台',
  avatar: {
    src: 'https://i.pravatar.cc/128?u=robot-admin',
    alt: '系统管理员'
  }
}, {
  id: 1002,
  username: 'operator',
  password: '123456',
  name: '装配工位操作员',
  email: 'operator@robot.local',
  roles: ['operator'],
  station: '装配工位 A01',
  avatar: {
    src: 'https://i.pravatar.cc/128?u=robot-operator',
    alt: '装配工位操作员'
  }
}]

const sessions = new Map<string, MockTokenSession>()

function clearExpiredSessions() {
  const now = Date.now()

  for (const [token, session] of sessions.entries()) {
    if (session.expiresAt <= now) {
      sessions.delete(token)
    }
  }
}

function toPublicUser(user: MockAuthUserRecord): PublicAuthUser {
  return {
    id: user.id,
    username: user.username,
    name: user.name,
    email: user.email,
    roles: user.roles,
    station: user.station,
    avatar: user.avatar
  }
}

export function authenticateMockUser(username: string, password: string) {
  return mockUsers.find(user => user.username === username && user.password === password) ?? null
}

export function createMockSession(username: string) {
  clearExpiredSessions()

  const token = `mock-${username}-${Math.random().toString(36).slice(2, 10)}-${Date.now()}`
  const expiresAt = Date.now() + SESSION_TTL_MS

  sessions.set(token, {
    token,
    username,
    expiresAt
  })

  return {
    token,
    expiresAt
  }
}

export function getMockUserByToken(token: string) {
  clearExpiredSessions()

  const session = sessions.get(token)
  if (!session) {
    return {
      success: false as const,
      errorCode: 'TOKEN_INVALID' as const
    }
  }

  if (session.expiresAt <= Date.now()) {
    sessions.delete(token)
    return {
      success: false as const,
      errorCode: 'TOKEN_EXPIRED' as const
    }
  }

  const user = mockUsers.find(item => item.username === session.username)
  if (!user) {
    sessions.delete(token)
    return {
      success: false as const,
      errorCode: 'TOKEN_INVALID' as const
    }
  }

  return {
    success: true as const,
    user: toPublicUser(user),
    expiresAt: session.expiresAt
  }
}

export function getMockUsersForHint() {
  return mockUsers.map(user => ({
    username: user.username,
    password: user.password,
    name: user.name
  }))
}

export { toPublicUser }