func VisionAnalysis()

in functions/image-analysis/go/main.go [56:119]


func VisionAnalysis(ctx context.Context, e GCSEvent) error {
	log.Printf("Event: %#v", e)

	filename := e.Name
	filebucket := e.Bucket
	log.Printf("New picture uploaded %s in %s", filename, filebucket)

	client, err := vision.NewImageAnnotatorClient(ctx)
	if err != nil {
		log.Printf("Failed to create client: %v", err)
		return errors.New("Failed to create CloudVision client")
	}
	defer client.Close()

	request := &pb.AnnotateImageRequest{
		Image: &pb.Image{
			Source: &pb.ImageSource{
				ImageUri: fmt.Sprintf("gs://%s/%s", filebucket, filename),
			},
		},
		Features: []*pb.Feature{
			{Type: pb.Feature_LABEL_DETECTION},
			{Type: pb.Feature_IMAGE_PROPERTIES},
			{Type: pb.Feature_SAFE_SEARCH_DETECTION},
		},
	}

	r, err := client.AnnotateImage(ctx, request)
	if err != nil {
		log.Printf("Failed annotate image: %v", err)
		return fmt.Errorf("Vision API error: code %d, message: '%s'", r.Error.Code, r.Error.Message)
	}

	resp := visionResponse{r}
	log.Printf("Raw vision output for: %s: %s", filename, resp.toJSON())

	labels := resp.getLabels()
	log.Printf("Labels: %s", strings.Join(labels, ", "))

	color := resp.getDominantColor()
	log.Printf("Color: %s", color)

	if !resp.isSafe() {
		return nil
	}

	// if the picture is safe to display, store it in Firestore
	pictureStore, err := firestore.NewClient(ctx, firestore.DetectProjectID)
	if err != nil {
		log.Printf("Failed to get 'pictures' firestore collection: %v", err)
		return errors.New("Failed to get 'pictures' firestore collection")
	}

	_, err = pictureStore.Doc("pictures/"+filename).Create(ctx, firestorePicture{
		Labels: labels,
		Color:  color,
	})
	if err != nil {
		log.Printf("Failed to add picture in firestore: %v", err)
		return errors.New("Failed to add picture in firestore")
	}

	return nil
}