// Copyright 2026 Mihna123 Software // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. package user import ( "errors" "fmt" "regexp" ) type RegisterInput struct { Username string Email string Phone string Password string } type CreateInput struct { Username string Email string Phone string PwHash string } var ErrInvalidInput = errors.New("invalid input") var ErrUserExists = errors.New("user already exists") var ErrUserNotFound = errors.New("user not found") var usrnameRegExp = regexp.MustCompile(`^[a-zA-Z][a-zA-Z0-9_-]*$`) var mailRegExp = regexp.MustCompile(`^[^@\s]+@[^@\s]+\.[^@\s]+$`) var phoneRegExp = regexp.MustCompile(`^\+?[0-9][0-9\s-]*$`) func (in *RegisterInput) validate() error { if len(in.Password) < 8 { return fmt.Errorf("%w: password too short - min is 8", ErrInvalidInput) } if len(in.Password) > 72 { return fmt.Errorf("%w: password too long - max is 72", ErrInvalidInput) } if in.Username == "" { return fmt.Errorf("%w: username is mandatory", ErrInvalidInput) } if !usrnameRegExp.MatchString(in.Username) { return fmt.Errorf("%w: bad username - must start with a letter and contain only letters, digits,'_' or '-'", ErrInvalidInput) } if len(in.Username) < 3 { return fmt.Errorf("%w: username too short - min is 3 chars", ErrInvalidInput) } if in.Email == "" { return fmt.Errorf("%w: email is mandatory", ErrInvalidInput) } if !mailRegExp.MatchString(in.Email) { return fmt.Errorf("%w: bad email format", ErrInvalidInput) } if in.Phone != "" && !phoneRegExp.MatchString(in.Phone) { return fmt.Errorf("%w: bad phone format", ErrInvalidInput) } return nil }