func handler()

in configs/main.go [123:240]


func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
	configbucket := os.Getenv("ECR_SCAN_CONFIG_BUCKET")
	fmt.Printf("DEBUG:: config continuous scan start\n")

	cfg, err := config.LoadDefaultConfig(context.TODO())
	if err != nil {
		return serverError(err)
	}
	svc := s3.NewFromConfig(cfg)

	switch request.HTTPMethod {
	case "POST":
		fmt.Printf("DEBUG:: adding scan config\n")
		ss := ScanSpec{}
		// Unmarshal the JSON payload in the POST:
		err := json.Unmarshal([]byte(request.Body), &ss)
		if err != nil {
			return serverError(err)
		}
		specID := uuid.NewV4()
		// if err != nil {
		// 	return serverError(err)
		// }
		ss.ID = specID.String()
		ss.CreationTime = fmt.Sprintf("%v", time.Now().Unix())
		err = storeScanSpec(configbucket, ss)
		if err != nil {
			return serverError(err)
		}
		msg := fmt.Sprintf("Added scan config. ID=%v ", ss.ID)
		return events.APIGatewayProxyResponse{
			StatusCode: http.StatusOK,
			Headers: map[string]string{
				"Content-Type":                "application/json",
				"Access-Control-Allow-Origin": "*",
			},
			Body: msg,
		}, nil
	case "DELETE":
		fmt.Printf("DEBUG:: removing scan config\n")
		// validate ID in URL path:
		if _, ok := request.PathParameters["id"]; !ok {
			return serverError(fmt.Errorf("Unknown configuration"))
		}
		resp, err := svc.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{
			Bucket: &configbucket,
		},
		)
		// resp, err := req.Send(context.TODO())
		if err != nil {
			return serverError(err)
		}
		for _, obj := range resp.Contents {
			fn := *obj.Key
			scanID := strings.TrimSuffix(fn, ".json")
			if scanID == request.PathParameters["id"] {
				rmClusterSpec(configbucket, scanID)
				msg := fmt.Sprintf("Deleted scan config %v ", request.PathParameters["id"])
				return events.APIGatewayProxyResponse{
					StatusCode: http.StatusOK,
					Headers: map[string]string{
						"Content-Type":                "application/json",
						"Access-Control-Allow-Origin": "*",
					},
					Body: msg,
				}, nil
			}
		}
		return events.APIGatewayProxyResponse{
			StatusCode: http.StatusNotFound,
			Headers: map[string]string{
				"Content-Type":                "application/json",
				"Access-Control-Allow-Origin": "*",
			},
			Body: "This scan config does not exist, no operation performed",
		}, nil
	case "GET":
		fmt.Printf("DEBUG:: listing scan config\n")
		resp, err := svc.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{
			Bucket: &configbucket,
		},
		)
		// resp, err := req.Send(context.TODO())
		if err != nil {
			return serverError(err)
		}
		scanspecs := []ScanSpec{}
		for _, obj := range resp.Contents {
			fn := *obj.Key
			scanID := strings.TrimSuffix(fn, ".json")
			scanspec, err := fetchScanSpec(configbucket, scanID)
			if err != nil {
				return serverError(err)
			}
			scanspecs = append(scanspecs, scanspec)

		}
		scanspecsjson, err := json.Marshal(scanspecs)
		if err != nil {
			return serverError(err)
		}
		return events.APIGatewayProxyResponse{
			StatusCode: http.StatusOK,
			Headers: map[string]string{
				"Content-Type":                "application/json",
				"Access-Control-Allow-Origin": "*",
			},
			Body: string(scanspecsjson),
		}, nil
	}
	fmt.Printf("DEBUG:: register continuous scan done\n")
	return events.APIGatewayProxyResponse{
		StatusCode: http.StatusMethodNotAllowed,
		Headers: map[string]string{
			"Access-Control-Allow-Origin": "*",
		},
	}, nil
}