Files
XQKqueue/server/internal/httpapi/personal.go
2026-07-12 15:53:24 +08:00

84 lines
2.2 KiB
Go

package httpapi
import (
"errors"
"fmt"
"calllinesystem/server/internal/model"
)
var errTicketPhoneUnavailable = errors.New("ticket phone data is unavailable")
func cloneStringPointer(value *string) *string {
if value == nil {
return nil
}
copy := *value
return &copy
}
func stringPointer(value string) *string {
return &value
}
func (s *Server) decryptTicketPersonal(ticket model.QueueTicket) (string, string, error) {
phone, err := s.decryptTicketPhone(ticket)
if err != nil {
return "", "", err
}
lastName, err := s.decryptTicketLastName(ticket)
if err != nil {
return "", "", err
}
return phone, lastName, nil
}
func (s *Server) decryptTicketPhone(ticket model.QueueTicket) (string, error) {
if ticket.PhoneHMAC == nil || len(ticket.PhoneCiphertext) == 0 || len(ticket.PhoneNonce) == 0 {
return "", errTicketPhoneUnavailable
}
phone, err := s.cipher.Decrypt(ticket.PhoneCiphertext, ticket.PhoneNonce, []byte("phone:"+ticket.ProjectID))
if err != nil {
return "", fmt.Errorf("decrypt ticket phone: %w", err)
}
return phone, nil
}
func (s *Server) decryptTicketLastName(ticket model.QueueTicket) (string, error) {
if len(ticket.LastNameCiphertext) == 0 && len(ticket.LastNameNonce) == 0 {
return "", nil
}
if len(ticket.LastNameCiphertext) == 0 || len(ticket.LastNameNonce) == 0 {
return "", errors.New("ticket last name data is incomplete")
}
lastName, err := s.cipher.Decrypt(ticket.LastNameCiphertext, ticket.LastNameNonce, []byte("last_name:"+ticket.ProjectID))
if err != nil {
return "", fmt.Errorf("decrypt ticket last name: %w", err)
}
return lastName, nil
}
func (s *Server) ticketPhoneLast4(ticket model.QueueTicket) (string, error) {
phone, err := s.decryptTicketPhone(ticket)
if err != nil {
if errors.Is(err, errTicketPhoneUnavailable) {
return "", nil
}
return "", err
}
return phoneLast4(phone)
}
func phoneLast4(phone string) (string, error) {
digits := make([]byte, 0, len(phone))
for i := 0; i < len(phone); i++ {
if phone[i] >= '0' && phone[i] <= '9' {
digits = append(digits, phone[i])
}
}
if len(digits) < 4 {
return "", errors.New("ticket phone has fewer than four digits")
}
return string(digits[len(digits)-4:]), nil
}