Initial commit
This commit is contained in:
83
server/internal/httpapi/personal.go
Normal file
83
server/internal/httpapi/personal.go
Normal file
@@ -0,0 +1,83 @@
|
||||
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 ©
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user