Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT][API] Add API to create a privacy metrics with time series job. #74

Open
youen opened this issue Mar 31, 2024 · 0 comments
Open

Comments

@youen
Copy link
Member

youen commented Mar 31, 2024

Description

This API allows users to create a privacy metrics with time series job. This API is used by the frontend to trigger the job creation.

Request

Method

POST

URL

/jobs/metrics/privacy_time_series

Request Parameters

None

Request Body

{
  "kind": "privacy_metrics_with_time_series",
  "parameters": {
    "dataset_id": "my_dataset",
    "privacy_metric_definition_names": ["my_definition"],
    "start_date": 2023-02-15,
    "end_date": 2023-02-16,
    "time_interval": "DAY"
  }
}

Result

Result parameters

None

Result Body

{
  "id": "my_job_id",
  "kind": "privacy_metrics_with_time_series",
  "created_at": "2023-02-15T12:00:00Z",
  "status": "PENDING",
  "parameters": {
    "dataset_id": "my_dataset",
    "privacy_metric_definition_names": ["my_definition"],
    "start_date": 2023-02-15,
    "end_date": 2023-02-16,
    "time_interval": "DAY"
  }
}

Example Curl Request

Request

curl -X POST -H "Content-Type: application/json" -d '{
  "kind": "privacy_metrics_with_time_series",
  "parameters": {
    "dataset_id": "my_dataset",
    "privacy_metric_definition_names": ["my_definition"],
    "start_date": 2023-02-15,
    "end_date": 2023-02-16,
    "time_interval": "DAY"
  }
}' http://localhost:8080/jobs/metrics/privacy_time_series

Curl Response

{
  "id": "my_job_id",
  "kind": "privacy_metrics_with_time_series",
  "created_at": "2023-02-15T12:00:00Z",
  "status": "PENDING",
  "parameters": {
    "dataset_id": "my_dataset",
    "privacy_metric_definition_names": ["my_definition"],
    "start_date": 2023-02-15,
    "end_date": 2023-02-16,
    "time_interval": "DAY"
  }
}

Go server

Struct

type PrivacyMetricsWithTimeSeriesJobCreateRequest struct {
  Kind            string                               `json:"kind"`
  Parameters      *PrivacyMetricsWithTimeSeriesParameters `json:"parameters"`
}

type PrivacyMetricsWithTimeSeriesParameters struct {
  DatasetID                            string                                    `json:"datasetId"`
  PrivacyMetricDefinitionNames      []string                                   `json:"privacyMetricDefinitionNames"`
  StartDate                          time.Time                                 `json:"startDate"`
  EndDate                            time.Time                                 `json:"endDate"`
  TimeInterval                       string                                    `json:"timeInterval"`
}

Handler

func (s *Server) CreatePrivacyMetricsWithTimeSeriesJob(ctx context.Context, w http.ResponseWriter, r *http.Request) {
  var request PrivacyMetricsWithTimeSeriesJobCreateRequest
  if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
    http.Error(w, "Failed to decode request body", http.StatusBadRequest)
    return
  }

  job, err := s.jobService.CreatePrivacyMetricsWithTimeSeriesJob(ctx, request.Parameters)
  if err != nil {
    http.Error(w, fmt.Sprintf("failed to create job: %v", err), http.StatusInternalServerError)
    return
  }

  if err := json.NewEncoder(w).Encode(job); err != nil {
    http.Error(w, "failed to encode response", http.StatusInternalServerError)
    return
  }
}
```  "status": "CREATED",
  "error_message": null,
  "traceback": null,
  "result": null,
  "parameters": {
    "query": "SELECT ..., ..., ... FROM ...",
    "privacy_metric_config": {
      "privacy_metric": "REVENUE",
      "privacy_unit": "REVENUE_DOLLARS",
      "source_table": "orders",
      "quasi_id_columns": [
        "customer_id"
      ]
    },
    "quasi_ids_histogram_buckets": [
      1,
      2,
      3,
      4,
      5
    ],
    "privacy_budget": 0.3,
    "run_interval": {
      "unit": "UNIT",
      "value": 0
    },
    "end_time": "2024-08-16T15:57:00.000Z",
    "group_by_quasi_ids": true
  },
  "current_progress": null
}

Go server

Struct

type PrivacyMetricsWithTimeSeriesJob struct {
	ID                uuid.UUID                      `json:"id"`
	Kind              JobKind                        `json:"kind"`
	CreatedAt         time.Time                      `json:"created_at"`
	Status            JobStatus                      `json:"status"`
	ErrorMessage      string                        `json:"error_message"`
	Traceback         string                        `json:"traceback"`
	Result            *MetaPrivacyMetrics           `json:"result,omitempty"`
	Parameters        PrivacyMetricsWithTimeSeriesParameters `json:"parameters"`
	CurrentProgress   *JobProgress                    `json:"current_progress,omitempty"`
}

type PrivacyMetricsWithTimeSeriesParameters struct {
	Query                                        string                       `json:"query"`
	PrivacyMetricConfig                          PrivacyMetricConfiguration   `json:"privacy_metric_config"`
	QuasiIdsHistogramBuckets                     []int                        `json:"quasi_ids_histogram_buckets"`
	PrivacyBudget                                float64                      `json:"privacy_budget"`
	RunInterval                                   RunInterval                  `json:"run_interval"`
	EndTime                                     string                       `json:"end_time"`
	GroupByQuasiIds                             bool                        `json:"group_by_quasi_ids"`
	DataInterval                                 string                       `json:"data_interval"`
	AggregateMetricsForDataInterval               bool                        `json:"aggregate_metrics_for_data_interval"`
	AggregateMetricsWithinGroupForDataInterval    bool                        `json:"aggregate_metrics_with_in_group_for_data_interval"`
	IncludeQuasiIdsInResults                    bool                        `json:"include_quasi_ids_in_results"`
	IncludeAggregateHistogramBucketsInResults     bool                        `json:"include_aggregate_histogram_buckets_in_results"`
	IncludeIndividualHistogramBucketsInResults   bool                        `json:"include_individual_histogram_buckets_in_results"`
}

func (r *PrivacyMetricsWithTimeSeriesJob) validate() error {
	if r.Query == "" {
		return errors.New("missing 'query' parameter")
	}
	if r.PrivacyMetricConfig == (PrivacyMetricConfiguration{}) {
		return errors.New("missing 'privacy_metric_config' parameter")
	}
	if len(r.QuasiIdsHistogramBuckets) == 0 {
		return errors.New("missing 'quasi_ids_histogram_buckets' parameter")
	}
	if r.PrivacyBudget == 0 {
		return errors.New("missing 'privacy_budget' parameter")
	}
	if r.RunInterval == (RunInterval{}) {
		return errors.New("missing 'run_interval' parameter")
	}
	if r.EndTime == "" {
		return errors.New("missing 'end_time' parameter")
	}
	return nil
}

func (r *PrivacyMetricsWithTimeSeriesJob) GetJobKind() JobKind { return r.Kind }
func (r *PrivacyMetricsWithTimeSeriesJob) GetJobID() uuid.UUID  { return r.ID }

Handler

func createPrivacyMetricsWithTimeSeriesJobHandler(w http.ResponseWriter, r *http.Request) {
	var req PrivacyMetricsWithTimeSeriesJobCreate

	err := json.NewDecoder(r.Body).Decode(&req)
	if err != nil {
		logger.WithField("
## Links

 - [Jobs.create_privacy_metrics_time_series_job](https://github.com/octopize/avatar-python/blob/0.6.2/avatars/api.py#L634)
 - [PrivacyMetricsWithTimeSeriesJobCreate](https://github.com/octopize/avatar-python/blob/0.6.2/avatars/api.py#L634)
 - [PrivacyMetricsWithTimeSeriesJob](https://github.com/octopize/avatar-python/blob/0.6.2/avatars/api.py#L634)


## Automated Issue Details

Dear visitor,

This issue has been automatically generated from the Octopize project [avatar-python](https://github.com/octopize/avatar-python/) to make SIGO compatible. Please vote with a thumbs up or thumbs down to assess the quality of the automatic generation.

Best regards,
The SIGO Team
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant