func()

in groups/service.go [135:204]


func (as *adminService) AddOrUpdateGroupMembers(group GoogleGroup, role string, members []string) error {
	if *verbose {
		log.Printf("adminService.AddOrUpdateGroupMembers %s %s %v", group.EmailId, role, members)
	}

	l, err := as.client.ListMembers(group.EmailId)
	if err != nil {
		if as.checkForAPIErr404(err) {
			log.Printf("skipping adding members to group %q as it has not yet been created\n", group.EmailId)
			return nil
		}
		return fmt.Errorf("unable to retrieve members in group %q: %w", group.EmailId, err)
	}

	// aggregate the errors that occured and return them together in the end.
	var errs []error

	for _, memberEmailId := range members {
		var member *admin.Member
		for _, m := range l {
			if EmailAddressEquals(m.Email, memberEmailId) {
				member = m
				break
			}
		}

		if member != nil {
			// update if necessary
			if member.Role != role {
				member.Role = role
				if config.ConfirmChanges {
					log.Printf("Updating %s to %q as a %s\n", memberEmailId, group.EmailId, role)
					_, err := as.client.UpdateMember(group.EmailId, member.Email, member)
					if err != nil {
						logErr := fmt.Errorf("unable to update %s in %q as %s: %w", memberEmailId, group.EmailId, role, err)
						log.Printf("%s\n", logErr)
						errs = append(errs, logErr)
						continue
					}
					log.Printf("Updated %s to %q as a %s\n", memberEmailId, group.EmailId, role)
				} else {
					log.Printf("dry-run: would update %s to %q as %s\n", memberEmailId, group.EmailId, role)
				}
			}
			continue
		}

		member = &admin.Member{
			Email: memberEmailId,
			Role:  role,
		}

		// We did not find the person in the google group, so we add them
		if config.ConfirmChanges {
			log.Printf("Adding %s to %q as a %s\n", memberEmailId, group.EmailId, role)
			_, err := as.client.InsertMember(group.EmailId, member)
			if err != nil {
				logErr := fmt.Errorf("unable to add %s to %q as %s: %w", memberEmailId, group.EmailId, role, err)
				log.Printf("%s\n", logErr)
				errs = append(errs, logErr)
				continue
			}
			log.Printf("Added %s to %q as a %s\n", memberEmailId, group.EmailId, role)
		} else {
			log.Printf("dry-run: would add %s to %q as %s\n", memberEmailId, group.EmailId, role)
		}
	}

	return utilerrors.NewAggregate(errs)
}