func dataSourceGitlabProjectIssuesRead()

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
}