389 lines
8.6 KiB
Go
389 lines
8.6 KiB
Go
package requestmodel
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
|
|
"git-molva.ru/Molva/molva-backend/services/api_gateway/internal/constants"
|
|
dbtypes "git-molva.ru/Molva/molva-backend/services/api_gateway/internal/database/types"
|
|
)
|
|
|
|
type SubmissionStatus string
|
|
|
|
const (
|
|
SubStatusUnspecified SubmissionStatus = "unspecified"
|
|
SubStatusNew SubmissionStatus = "new"
|
|
SubStatusPending SubmissionStatus = "pending"
|
|
SubStatusOnInterview SubmissionStatus = "on_interview"
|
|
SubStatusApproved SubmissionStatus = "approved"
|
|
SubStatusCancelled SubmissionStatus = "cancelled"
|
|
SubStatusRejected SubmissionStatus = "rejected"
|
|
)
|
|
|
|
func (s *SubmissionStatus) NullString() *string {
|
|
if s == nil {
|
|
return nil
|
|
}
|
|
|
|
return (*string)(s)
|
|
}
|
|
|
|
type (
|
|
Submission struct {
|
|
Id string `json:"id"`
|
|
AgentInfo *AgentInfo `json:"agent_info"`
|
|
VacancyInfo *VacancyInfo `json:"vacancy_info"`
|
|
CandidateInfo *CandidateInfo `json:"candidate_info"`
|
|
Status SubmissionStatus `json:"status"`
|
|
}
|
|
|
|
AgentInfo struct {
|
|
Id string `json:"id"`
|
|
}
|
|
|
|
VacancyInfo struct {
|
|
Id string `json:"id"`
|
|
}
|
|
|
|
CandidateInfo struct {
|
|
Id string `json:"id"`
|
|
FirstName string `json:"first_name"`
|
|
LastName string `json:"last_name"`
|
|
MiddleName string `json:"middle_name"`
|
|
PhoneNumber string `json:"phone_number"`
|
|
Email string `json:"email"`
|
|
Birthday string `json:"birthday"`
|
|
CvLink *string `json:"cv_link"`
|
|
Resume *string `json:"resume"`
|
|
}
|
|
)
|
|
|
|
func (s *Submission) From(msg *dbtypes.Submission) *Submission {
|
|
if msg == nil {
|
|
return nil
|
|
}
|
|
|
|
res := &Submission{
|
|
Id: msg.Id,
|
|
Status: SubmissionStatus(msg.Status),
|
|
}
|
|
|
|
if msg.AgentInfo != nil {
|
|
res.AgentInfo = &AgentInfo{
|
|
Id: msg.AgentInfo.Id,
|
|
}
|
|
}
|
|
|
|
if msg.VacancyInfo != nil {
|
|
res.VacancyInfo = &VacancyInfo{
|
|
Id: msg.VacancyInfo.Id,
|
|
}
|
|
}
|
|
|
|
if msg.CandidateInfo != nil {
|
|
res.CandidateInfo = &CandidateInfo{
|
|
Id: msg.CandidateInfo.Id,
|
|
FirstName: msg.CandidateInfo.FirstName,
|
|
LastName: msg.CandidateInfo.LastName,
|
|
MiddleName: msg.CandidateInfo.MiddleName,
|
|
PhoneNumber: msg.CandidateInfo.PhoneNumber,
|
|
Email: msg.CandidateInfo.Email,
|
|
Birthday: msg.CandidateInfo.Birthday,
|
|
CvLink: msg.CandidateInfo.CvLink,
|
|
Resume: msg.CandidateInfo.Resume,
|
|
}
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
type (
|
|
SubmissionListGetRequest struct {
|
|
AgentId string
|
|
Filters *SubmissionListGetFilters
|
|
Page uint64
|
|
PageSize uint64
|
|
}
|
|
|
|
SubmissionListGetFilters struct {
|
|
VacancyId *string
|
|
Status *SubmissionStatus
|
|
}
|
|
|
|
SubmissionListGetResponse struct {
|
|
Submissions []Submission `json:"submissions"`
|
|
}
|
|
)
|
|
|
|
func (r *SubmissionListGetRequest) FromQuery(query url.Values) (*SubmissionListGetRequest, error) {
|
|
if query == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
var filters SubmissionListGetFilters
|
|
|
|
if val, ok := query["vacancy_id"]; ok {
|
|
filters.VacancyId = &val[0]
|
|
}
|
|
|
|
if val, ok := query["status"]; ok {
|
|
status := SubmissionStatus(val[0])
|
|
filters.Status = &status
|
|
}
|
|
|
|
res := &SubmissionListGetRequest{
|
|
Filters: &filters,
|
|
Page: constants.DefaultPaginationPage,
|
|
PageSize: constants.DefaultPaginationPageSize,
|
|
}
|
|
|
|
if val, ok := query["page"]; ok {
|
|
intVal, err := parseUint64(val[0])
|
|
if err != nil {
|
|
return nil, fmt.Errorf("invalid page param: %w", err)
|
|
}
|
|
|
|
res.Page = intVal
|
|
}
|
|
|
|
if val, ok := query["page_size"]; ok {
|
|
intVal, err := parseUint64(val[0])
|
|
if err != nil {
|
|
return nil, fmt.Errorf("invalid page_size param: %w", err)
|
|
}
|
|
|
|
res.PageSize = intVal
|
|
}
|
|
|
|
return res, nil
|
|
}
|
|
|
|
func (r *SubmissionListGetRequest) Validate() error {
|
|
if r == nil {
|
|
return fmt.Errorf("%w: request is nil", ErrValidation)
|
|
}
|
|
|
|
if r.AgentId == "" {
|
|
return fmt.Errorf("%w: AgentID is required", ErrValidation)
|
|
}
|
|
|
|
if r.Filters != nil {
|
|
if r.Filters.Status != nil && !(*r.Filters.Status == SubStatusUnspecified ||
|
|
*r.Filters.Status == SubStatusNew ||
|
|
*r.Filters.Status == SubStatusPending ||
|
|
*r.Filters.Status == SubStatusOnInterview ||
|
|
*r.Filters.Status == SubStatusApproved ||
|
|
*r.Filters.Status == SubStatusCancelled ||
|
|
*r.Filters.Status == SubStatusRejected) {
|
|
return fmt.Errorf("%w: invalid status: %v", ErrValidation, *r.Filters.Status)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *SubmissionListGetResponse) From(msg *dbtypes.SubmissionListGetResponse) *SubmissionListGetResponse {
|
|
if msg == nil {
|
|
return nil
|
|
}
|
|
|
|
res := &SubmissionListGetResponse{
|
|
Submissions: make([]Submission, len(msg.Submissions)),
|
|
}
|
|
|
|
for i, subm := range msg.Submissions {
|
|
res.Submissions[i] = *new(Submission).From(&subm)
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
type (
|
|
SubmissionListForVacancyGetRequest struct {
|
|
VacancyId string
|
|
Filters *SubmissionListForVacancyGetFilters
|
|
Page uint64
|
|
PageSize uint64
|
|
}
|
|
|
|
SubmissionListForVacancyGetFilters struct {
|
|
Status *SubmissionStatus
|
|
}
|
|
|
|
SubmissionListForVacancyGetResponse struct {
|
|
Submissions []Submission `json:"submissions"`
|
|
}
|
|
)
|
|
|
|
func (r *SubmissionListForVacancyGetRequest) FromQuery(query url.Values) (*SubmissionListForVacancyGetRequest, error) {
|
|
if query == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
var filters SubmissionListForVacancyGetFilters
|
|
|
|
if val, ok := query["status"]; ok {
|
|
status := SubmissionStatus(val[0])
|
|
filters.Status = &status
|
|
}
|
|
|
|
res := &SubmissionListForVacancyGetRequest{
|
|
Filters: &filters,
|
|
Page: constants.DefaultPaginationPage,
|
|
PageSize: constants.DefaultPaginationPageSize,
|
|
}
|
|
|
|
if val, ok := query["page"]; ok {
|
|
intVal, err := parseUint64(val[0])
|
|
if err != nil {
|
|
return nil, fmt.Errorf("invalid page param: %w", err)
|
|
}
|
|
|
|
res.Page = intVal
|
|
}
|
|
|
|
if val, ok := query["page_size"]; ok {
|
|
intVal, err := parseUint64(val[0])
|
|
if err != nil {
|
|
return nil, fmt.Errorf("invalid page_size param: %w", err)
|
|
}
|
|
|
|
res.PageSize = intVal
|
|
}
|
|
|
|
return res, nil
|
|
}
|
|
|
|
func (r *SubmissionListForVacancyGetRequest) Validate() error {
|
|
if r == nil {
|
|
return fmt.Errorf("%w: request is nil", ErrValidation)
|
|
}
|
|
|
|
if r.VacancyId == "" {
|
|
return fmt.Errorf("%w: VacancyID is required", ErrValidation)
|
|
}
|
|
|
|
if r.Filters != nil {
|
|
if r.Filters.Status != nil && !(*r.Filters.Status == SubStatusUnspecified ||
|
|
*r.Filters.Status == SubStatusNew ||
|
|
*r.Filters.Status == SubStatusPending ||
|
|
*r.Filters.Status == SubStatusOnInterview ||
|
|
*r.Filters.Status == SubStatusApproved ||
|
|
*r.Filters.Status == SubStatusCancelled ||
|
|
*r.Filters.Status == SubStatusRejected) {
|
|
return fmt.Errorf("%w: invalid status: %v", ErrValidation, *r.Filters.Status)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *SubmissionListForVacancyGetResponse) From(msg *dbtypes.SubmissionListGetResponse) *SubmissionListForVacancyGetResponse {
|
|
if msg == nil {
|
|
return nil
|
|
}
|
|
|
|
res := &SubmissionListForVacancyGetResponse{
|
|
Submissions: make([]Submission, len(msg.Submissions)),
|
|
}
|
|
|
|
for i, subm := range msg.Submissions {
|
|
res.Submissions[i] = *new(Submission).From(&subm)
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
type (
|
|
SubmissionCreateRequest struct {
|
|
AgentId string `json:"agent_id"`
|
|
VacancyId string `json:"vacancy_id"`
|
|
CandidateInfo *CandidateInfo `json:"candidate_info"`
|
|
}
|
|
|
|
SubmissionCreateResponse struct {
|
|
Id string `json:"id"`
|
|
}
|
|
)
|
|
|
|
func (r *SubmissionCreateRequest) Validate() error {
|
|
if r == nil {
|
|
return fmt.Errorf("%w: request is nil", ErrValidation)
|
|
}
|
|
|
|
if r.AgentId == "" {
|
|
return fmt.Errorf("%w: AgentID is required", ErrValidation)
|
|
}
|
|
|
|
if r.VacancyId == "" {
|
|
return fmt.Errorf("%w: VacancyID is required", ErrValidation)
|
|
}
|
|
|
|
if r.CandidateInfo == nil {
|
|
return fmt.Errorf("%w: CandidateInfo is required", ErrValidation)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *SubmissionCreateResponse) From(msg *dbtypes.SubmissionCreateResponse) *SubmissionCreateResponse {
|
|
if msg == nil {
|
|
return nil
|
|
}
|
|
|
|
return &SubmissionCreateResponse{
|
|
Id: msg.Id,
|
|
}
|
|
}
|
|
|
|
type (
|
|
SubmissionStatusUpdateRequest struct {
|
|
Id string
|
|
Status SubmissionStatus `json:"status"`
|
|
}
|
|
|
|
SubmissionStatusUpdateResponse struct{}
|
|
)
|
|
|
|
func (r *SubmissionStatusUpdateRequest) Validate() error {
|
|
if r == nil {
|
|
return fmt.Errorf("%w: request is nil", ErrValidation)
|
|
}
|
|
|
|
if r.Id == "" {
|
|
return fmt.Errorf("%w: ID is required", ErrValidation)
|
|
}
|
|
|
|
if !(r.Status == SubStatusUnspecified ||
|
|
r.Status == SubStatusNew ||
|
|
r.Status == SubStatusPending ||
|
|
r.Status == SubStatusOnInterview ||
|
|
r.Status == SubStatusApproved ||
|
|
r.Status == SubStatusCancelled ||
|
|
r.Status == SubStatusRejected) {
|
|
return fmt.Errorf("%w: invalid status: %v", ErrValidation, r.Status)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type (
|
|
SubmissionDeleteRequest struct {
|
|
Id string
|
|
}
|
|
|
|
SubmissionDeleteResponse struct{}
|
|
)
|
|
|
|
func (r *SubmissionDeleteRequest) Validate() error {
|
|
if r == nil {
|
|
return fmt.Errorf("%w: request is nil", ErrValidation)
|
|
}
|
|
|
|
if r.Id == "" {
|
|
return fmt.Errorf("%w: ID is required", ErrValidation)
|
|
}
|
|
|
|
return nil
|
|
}
|