91 lines
2.7 KiB
Go
91 lines
2.7 KiB
Go
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
|
||
}
|