Files
test_deploy/internal/request_model/submission.go
Alex Shevchuk d84487d238 1
2025-08-18 17:12:04 +03:00

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
}