GetProjects returns a paginated list of Projects based on `query`
(query *ProjectQuery)
| 52 | |
| 53 | // GetProjects returns a paginated list of Projects based on `query` |
| 54 | func GetProjects(query *ProjectQuery) ([]*models.ApiOutputProject, int64, errors.Error) { |
| 55 | // verify input |
| 56 | if err := VerifyStruct(query); err != nil { |
| 57 | return nil, 0, err |
| 58 | } |
| 59 | clauses := []dal.Clause{ |
| 60 | dal.From(&models.Project{}), |
| 61 | } |
| 62 | if query.Keyword != nil { |
| 63 | clauses = append(clauses, dal.Where("LOWER(name) LIKE ?", "%"+query.GetKeyword()+"%")) |
| 64 | } |
| 65 | |
| 66 | count, err := db.Count(clauses...) |
| 67 | if err != nil { |
| 68 | return nil, 0, errors.Default.Wrap(err, "error getting DB count of project") |
| 69 | } |
| 70 | |
| 71 | clauses = append(clauses, |
| 72 | dal.Orderby("created_at DESC"), |
| 73 | dal.Offset(query.GetSkip()), |
| 74 | dal.Limit(query.GetPageSize()), |
| 75 | ) |
| 76 | projects := make([]*models.Project, count) |
| 77 | err = db.All(&projects, clauses...) |
| 78 | if err != nil { |
| 79 | return nil, 0, errors.Default.Wrap(err, "error finding DB project") |
| 80 | } |
| 81 | apiOutProjects := make([]*models.ApiOutputProject, len(projects)) |
| 82 | g := new(errgroup.Group) |
| 83 | for idx, project := range projects { |
| 84 | tmpProject := *project |
| 85 | tmpIdx := idx |
| 86 | g.Go(func() error { |
| 87 | apiOutputProject, err := makeProjectOutput(&tmpProject, true) |
| 88 | if err != nil { |
| 89 | logger.Error(err, "makeProjectOutput, name: %s", tmpProject.Name) |
| 90 | return errors.Default.Wrap(err, "error making project output") |
| 91 | } |
| 92 | apiOutProjects[tmpIdx] = apiOutputProject |
| 93 | return nil |
| 94 | }) |
| 95 | } |
| 96 | if err := g.Wait(); err != nil { |
| 97 | return nil, 0, errors.Convert(err) |
| 98 | } |
| 99 | return apiOutProjects, count, nil |
| 100 | } |
| 101 | |
| 102 | // CreateProject accepts a project instance and insert it to database |
| 103 | func CreateProject(projectInput *models.ApiInputProject) (*models.ApiOutputProject, errors.Error) { |
nothing calls this directly
no test coverage detected