func SetBigQueryIAMPermission()

in internal/apiclient/iam.go [321:370]


func SetBigQueryIAMPermission(project string, datasetid string, memberName string) (err error) {
	endpoint := fmt.Sprintf("https://bigquery.googleapis.com/bigquery/v2/projects/%s/datasets/%s", project, datasetid)
	const role = "WRITER"
	var content []byte

	defer ClientPrintHttpResponse.Set(GetCmdPrintHttpResponseSetting())
	ClientPrintHttpResponse.Set(false)

	// first fetch the information
	respBody, err := HttpClient(endpoint)
	if err != nil {
		return err
	}

	type accessType struct {
		Role         string  `json:"role,omitempty"`
		IamMember    *string `json:"iamMember,omitempty"`
		UserByEmail  *string `json:"userByEmail,omitempty"`
		SpecialGroup *string `json:"specialGroup,omitempty"`
		GroupByEmail *string `json:"groupByEmail,omitempty"`
	}

	type datasetType struct {
		Access []accessType `json:"access,omitempty"`
	}

	dataset := datasetType{}
	if err = json.Unmarshal(respBody, &dataset); err != nil {
		return err
	}

	access := accessType{}
	access.Role = role
	access.UserByEmail = new(string)
	*access.UserByEmail = memberName

	// merge the updates
	dataset.Access = append(dataset.Access, access)

	if content, err = json.Marshal(dataset); err != nil {
		return err
	}

	// patch the update
	if _, err = HttpClient(endpoint, string(content), "PATCH"); err != nil {
		return err
	}

	return nil
}