blob: faa73bfc0cb6b4c09301b22e05962134a256dcee [file] [log] [blame]
// Copyright 2019 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'package:appengine/appengine.dart';
import 'package:cocoon_service/src/model/appengine/time_series.dart';
import 'package:gcloud/db.dart';
import 'package:meta/meta.dart';
import '../datastore/cocoon_config.dart';
import '../model/appengine/key_helper.dart';
import '../request_handling/api_request_handler.dart';
import '../request_handling/authentication.dart';
import '../request_handling/body.dart';
import '../request_handling/exceptions.dart';
import '../service/datastore.dart';
@immutable
class UpdateBenchmarkTargets
extends ApiRequestHandler<UpdateBenchmarkTargetsResponse> {
const UpdateBenchmarkTargets(
Config config,
AuthenticationProvider authenticationProvider, {
@visibleForTesting
this.datastoreProvider = DatastoreService.defaultProvider,
}) : super(config: config, authenticationProvider: authenticationProvider);
final DatastoreServiceProvider datastoreProvider;
static const String timeSeriesKeyParam = 'TimeSeriesKey';
static const String goalParam = 'Goal';
static const String baselineParam = 'Baseline';
@override
Future<UpdateBenchmarkTargetsResponse> post() async {
checkRequiredParameters(
<String>[timeSeriesKeyParam, goalParam, baselineParam]);
final ClientContext clientContext = authContext.clientContext;
final DatastoreService datastore = datastoreProvider(config.db);
final KeyHelper keyHelper =
KeyHelper(applicationContext: clientContext.applicationContext);
double goal = requestData[goalParam] as double;
double baseline = requestData[baselineParam] as double;
Key timeSeriesKey;
try {
timeSeriesKey =
keyHelper.decode(requestData[timeSeriesKeyParam] as String);
} catch (error) {
throw BadRequestException(
'Bad timeSeries key: ${requestData[timeSeriesKeyParam]}');
}
final TimeSeries timeSeries = await config.db.lookupValue<TimeSeries>(
timeSeriesKey,
orElse: () {
throw BadRequestException('Invalid time series Key: $timeSeriesKey');
},
);
if (goal < 0) {
goal = 0;
}
if (baseline < 0) {
baseline = 0;
}
timeSeries.goal = goal;
timeSeries.baseline = baseline;
await datastore.db.commit(inserts: <TimeSeries>[timeSeries]);
return UpdateBenchmarkTargetsResponse(timeSeries);
}
}
@immutable
class UpdateBenchmarkTargetsResponse extends JsonBody {
const UpdateBenchmarkTargetsResponse(this.timeSeries)
: assert(timeSeries != null);
final TimeSeries timeSeries;
@override
Map<String, dynamic> toJson() {
return <String, dynamic>{
'Goal': timeSeries.goal,
'Baseline': timeSeries.baseline,
};
}
}