package storage import "context" type AdminVacancy struct { ID int64 `json:"id"` Slug string `json:"slug"` Title string `json:"title"` Description string `json:"description"` Duties string `json:"duties"` Requirements string `json:"requirements"` Conditions string `json:"conditions"` Salary string `json:"salary"` Sort int `json:"sort"` Published bool `json:"published"` } func (s *Storage) AdminVacancies(ctx context.Context) ([]AdminVacancy, error) { rows, err := s.pool.Query(ctx, ` SELECT id, slug, title, description, duties, requirements, conditions, salary, sort, published FROM vacancies ORDER BY sort, title`) if err != nil { return nil, err } defer rows.Close() var out []AdminVacancy for rows.Next() { var v AdminVacancy if err := rows.Scan(&v.ID, &v.Slug, &v.Title, &v.Description, &v.Duties, &v.Requirements, &v.Conditions, &v.Salary, &v.Sort, &v.Published); err != nil { return nil, err } out = append(out, v) } return out, rows.Err() } type VacancyInput struct { Slug string Title string Description string Duties string Requirements string Conditions string Salary string Sort int Published bool } func (s *Storage) AdminCreateVacancy(ctx context.Context, in VacancyInput) (int64, error) { var id int64 err := s.pool.QueryRow(ctx, ` INSERT INTO vacancies (slug, title, description, duties, requirements, conditions, salary, sort, published) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9) RETURNING id`, in.Slug, in.Title, in.Description, in.Duties, in.Requirements, in.Conditions, in.Salary, in.Sort, in.Published).Scan(&id) return id, wrapConflict(err) } func (s *Storage) AdminUpdateVacancy(ctx context.Context, id int64, in VacancyInput) error { tag, err := s.pool.Exec(ctx, ` UPDATE vacancies SET slug=$2, title=$3, description=$4, duties=$5, requirements=$6, conditions=$7, salary=$8, sort=$9, published=$10, updated_at=now() WHERE id=$1`, id, in.Slug, in.Title, in.Description, in.Duties, in.Requirements, in.Conditions, in.Salary, in.Sort, in.Published) if err != nil { return wrapConflict(err) } if tag.RowsAffected() == 0 { return ErrNotFound } return nil } // AdminDeleteVacancy удаляет вакансию насовсем: история по ним не нужна, // а закрытую на время вакансию достаточно скрыть галочкой. func (s *Storage) AdminDeleteVacancy(ctx context.Context, id int64) error { tag, err := s.pool.Exec(ctx, `DELETE FROM vacancies WHERE id=$1`, id) if err != nil { return err } if tag.RowsAffected() == 0 { return ErrNotFound } return nil }