in internal/provider/sdk/data_source_gitlab_project_issues.go [213:368]
func dataSourceGitlabProjectIssuesRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
client := meta.(*gitlab.Client)
project := d.Get("project").(string)
options := gitlab.ListProjectIssuesOptions{
ListOptions: gitlab.ListOptions{
PerPage: 20,
Page: 1,
},
}
if v, ok := d.GetOk("iids"); ok {
options.IIDs = intSetToIntSlice(v.(*schema.Set))
}
if v, ok := d.GetOk("state"); ok {
options.State = gitlab.Ptr(v.(string))
}
if v, ok := d.GetOk("labels"); ok {
gitlabLabels := gitlab.LabelOptions(*stringSetToStringSlice(v.(*schema.Set)))
options.Labels = &gitlabLabels
}
if v, ok := d.GetOk("not_labels"); ok {
gitlabLabels := gitlab.LabelOptions(*stringSetToStringSlice(v.(*schema.Set)))
options.Labels = &gitlabLabels
}
if v, ok := d.GetOk("with_labels_details"); ok {
options.WithLabelDetails = gitlab.Ptr(v.(bool))
}
if v, ok := d.GetOk("milestone"); ok {
options.Milestone = gitlab.Ptr(v.(string))
}
if v, ok := d.GetOk("not_milestone"); ok {
options.NotMilestone = gitlab.Ptr(v.(string))
}
if v, ok := d.GetOk("scope"); ok {
options.Scope = gitlab.Ptr(v.(string))
}
if v, ok := d.GetOk("author_id"); ok {
options.AuthorID = gitlab.Ptr(v.(int))
}
if v, ok := d.GetOk("not_author_id"); ok {
options.NotAuthorID = gitlab.Ptr(v.(int))
}
if v, ok := d.GetOk("assignee_id"); ok {
options.AssigneeID = gitlab.Ptr(v.(int))
}
if v, ok := d.GetOk("not_assignee_id"); ok {
options.NotAssigneeID = gitlab.Ptr(v.(int))
}
if v, ok := d.GetOk("assignee_username"); ok {
options.AssigneeUsername = gitlab.Ptr(v.(string))
}
if v, ok := d.GetOk("my_reaction_emoji"); ok {
options.MyReactionEmoji = gitlab.Ptr(v.(string))
}
if v, ok := d.GetOk("not_my_reaction_emoji"); ok {
options.NotMyReactionEmoji = gitlab.Ptr(v.(string))
}
if v, ok := d.GetOk("order_by"); ok {
options.OrderBy = gitlab.Ptr(v.(string))
}
if v, ok := d.GetOk("sort"); ok {
options.Sort = gitlab.Ptr(v.(string))
}
if v, ok := d.GetOk("search"); ok {
options.Search = gitlab.Ptr(v.(string))
}
if v, ok := d.GetOk("in"); ok {
options.In = gitlab.Ptr(v.(string))
}
if v, ok := d.GetOk("created_after"); ok {
parsedCreatedAfter, err := time.Parse(time.RFC3339, v.(string))
if err != nil {
return diag.Errorf("failed to parse created_after: %s. It must be in valid RFC3339 format.", err)
}
options.CreatedAfter = gitlab.Ptr(parsedCreatedAfter)
}
if v, ok := d.GetOk("created_before"); ok {
parsedCreatedBefore, err := time.Parse(time.RFC3339, v.(string))
if err != nil {
return diag.Errorf("failed to parse created_before: %s. It must be in valid RFC3339 format.", err)
}
options.CreatedBefore = gitlab.Ptr(parsedCreatedBefore)
}
if v, ok := d.GetOk("due_date"); ok {
options.DueDate = gitlab.Ptr(v.(string))
}
if v, ok := d.GetOk("updated_after"); ok {
parsedUpdatedAfter, err := time.Parse(time.RFC3339, v.(string))
if err != nil {
return diag.Errorf("failed to parse updated_after: %s. It must be in valid RFC3339 format.", err)
}
options.UpdatedAfter = gitlab.Ptr(parsedUpdatedAfter)
}
if v, ok := d.GetOk("updated_before"); ok {
parsedUpdatedBefore, err := time.Parse(time.RFC3339, v.(string))
if err != nil {
return diag.Errorf("failed to parse updated_before: %s. It must be in valid RFC3339 format.", err)
}
options.UpdatedBefore = gitlab.Ptr(parsedUpdatedBefore)
}
if v, ok := d.GetOk("confidential"); ok {
options.Confidential = gitlab.Ptr(v.(bool))
}
if v, ok := d.GetOk("issue_type"); ok {
options.IssueType = gitlab.Ptr(v.(string))
}
var issues []*gitlab.Issue
for options.Page != 0 {
paginatedIssues, resp, err := client.Issues.ListProjectIssues(project, &options, gitlab.WithContext(ctx))
if err != nil {
return diag.FromErr(err)
}
issues = append(issues, paginatedIssues...)
options.Page = resp.NextPage
}
optionsHash, err := hashstructure.Hash(&options, hashstructure.FormatV1, nil)
if err != nil {
return diag.FromErr(err)
}
d.SetId(fmt.Sprintf("%s-%d", project, optionsHash))
if err = d.Set("issues", flattenGitlabProjectIssues(issues)); err != nil {
return diag.Errorf("failed to set issues to state: %v", err)
}
return nil
}