Skip to main content

Overview

The User model represents individuals registered in the BD Scan Face system. Each user has biometric face data, access logs, and is associated with a user type that defines their role and permissions.

Model Fields

user_id
Int
required
Primary key. Auto-incremented unique identifier for the user.
ci
String
required
Cedula de Identidad (ID document number). Must be unique across all users. Maximum 20 characters.
first_name
String
required
User’s first name. Maximum 100 characters.
last_name
String
required
User’s last name. Maximum 100 characters.
email
String
required
User’s email address. Must be unique across all users. Maximum 100 characters.
phone
String | null
Optional phone number. Maximum 20 characters.
user_type_id
Int
required
Foreign key reference to the UserType model. Defines the user’s role in the system.
code
Int
required
Unique numeric code for the user. Can be used for manual identification or entry.
status
Boolean
default:"true"
Indicates whether the user account is active. Defaults to true.
registration_date
DateTime
default:"now()"
Timestamp when the user was registered in the system. Automatically set to current time.

Relationships

user_type
UserType
The UserType associated with this user. Defines role and permissions.
faces
Face[]
Array of Face records containing biometric encoding data for this user.
access_logs
AccessLog[]
Array of AccessLog records tracking this user’s access events across devices.

Query Examples

Find All Users

const users = await prisma.user.findMany({
  include: {
    user_type: true,
    faces: true,
    _count: {
      select: { access_logs: true }
    }
  },
  orderBy: {
    registration_date: 'desc'
  }
});

Find User by ID

const user = await prisma.user.findUnique({
  where: {
    user_id: 1
  },
  include: {
    user_type: true,
    faces: {
      orderBy: {
        upload_date: 'desc'
      }
    },
    access_logs: {
      take: 10,
      orderBy: {
        access_date: 'desc'
      },
      include: {
        device: true
      }
    }
  }
});

Find User by CI or Email

const userByCi = await prisma.user.findUnique({
  where: {
    ci: '12345678'
  },
  include: {
    user_type: true
  }
});

const userByEmail = await prisma.user.findUnique({
  where: {
    email: '[email protected]'
  }
});

Find User by Code

const userByCode = await prisma.user.findUnique({
  where: {
    code: 1001
  },
  include: {
    user_type: true,
    faces: true
  }
});

Create New User

const newUser = await prisma.user.create({
  data: {
    ci: '12345678',
    first_name: 'John',
    last_name: 'Doe',
    email: '[email protected]',
    phone: '+1234567890',
    user_type_id: 1,
    code: 1001,
    status: true
  },
  include: {
    user_type: true
  }
});

Update User

const updatedUser = await prisma.user.update({
  where: {
    user_id: 1
  },
  data: {
    phone: '+9876543210',
    email: '[email protected]',
    status: false
  },
  include: {
    user_type: true
  }
});

Delete User

// Note: Consider cascading deletes for related faces and access_logs
const deletedUser = await prisma.user.delete({
  where: {
    user_id: 1
  }
});

Filter Active Users by Type

const activeEmployees = await prisma.user.findMany({
  where: {
    status: true,
    user_type: {
      type_name: 'Employee'
    }
  },
  include: {
    user_type: true,
    faces: true
  },
  orderBy: {
    last_name: 'asc'
  }
});

Search Users by Name

const searchResults = await prisma.user.findMany({
  where: {
    OR: [
      {
        first_name: {
          contains: 'John',
          mode: 'insensitive'
        }
      },
      {
        last_name: {
          contains: 'John',
          mode: 'insensitive'
        }
      }
    ],
    status: true
  },
  include: {
    user_type: true
  }
});

Get Users with Recent Access

const recentlyActiveUsers = await prisma.user.findMany({
  where: {
    access_logs: {
      some: {
        access_date: {
          gte: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) // Last 7 days
        }
      }
    }
  },
  include: {
    user_type: true,
    _count: {
      select: { access_logs: true }
    }
  }
});

Unique Constraints

  • ci: Must be unique across all users
  • email: Must be unique across all users
  • code: Must be unique across all users

Database Mapping

This model maps to the users table in the database.

Build docs developers (and LLMs) love