Skip to content

Commit 51df722

Browse files
authored
Merge pull request #4008 from ProjectSidewalk/develop
v9.2.0
2 parents 8896ba4 + 16b599e commit 51df722

File tree

77 files changed

+1399
-412
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+1399
-412
lines changed

app/actor/CheckImageExpiryActor.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ class CheckImageExpiryActor @Inject() (gsvDataService: GsvDataService)(implicit
5252
def receive: Receive = { case CheckImageExpiryActor.Tick =>
5353
val currentTimeStart: String = dateFormatter.format(Instant.now())
5454
logger.info(s"Auto-scheduled checking image expiry started at: $currentTimeStart")
55-
gsvDataService.checkForGsvImagery().onComplete {
56-
case Success(_) =>
55+
gsvDataService.checkForGsvImagery.onComplete {
56+
case Success(results) =>
57+
logger.info(results)
5758
val currentEndTime: String = dateFormatter.format(Instant.now())
5859
logger.info(s"Checking image expiry completed at: $currentEndTime")
5960
case Failure(e) => logger.error(s"Error checking for expired imagery: ${e.getMessage}")

app/controllers/AdminController.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class AdminController @Inject() (
3939
regionService: RegionService,
4040
labelService: LabelService,
4141
streetService: StreetService,
42+
gsvDataService: GsvDataService,
4243
userService: service.UserService,
4344
actorSystem: ActorSystem,
4445
cpuEc: CpuIntensiveExecutionContext
@@ -566,6 +567,14 @@ class AdminController @Inject() (
566567
}
567568
}
568569

570+
/**
571+
* Checks for Google Street View imagery that might be missing. Same as nightly process.
572+
*/
573+
def checkGsvImagery() = cc.securityService.SecuredAction(WithAdmin()) { implicit request =>
574+
logger.debug(request.toString) // Added bc scalafmt doesn't like "implicit _" & compiler needs us to use request.
575+
gsvDataService.checkForGsvImagery.map { results => Ok(results) }
576+
}
577+
569578
/**
570579
* Returns information about the thread pools used by the application. Useful for debugging & monitoring thread usage.
571580
*/

app/controllers/ApplicationController.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class ApplicationController @Inject() (
7474
auditedDist: Float <- streetService.getAuditedStreetDistance(metric)
7575
streetDist: Float <- streetService.getTotalStreetDistance(metric)
7676
labelCount: Int <- labelService.countLabels
77-
valCount: Int <- validationService.countValidations
77+
valCount: Int <- validationService.countHumanValidations
7878
} yield {
7979
Ok(
8080
views.html.index("Project Sidewalk", commonData, user, openStatus, mapathonLink, streetDist, auditedDist,

app/controllers/ExploreController.scala

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import formats.json.ExploreFormats._
77
import formats.json.MissionFormats._
88
import models.audit._
99
import models.auth.DefaultEnv
10+
import models.label.LabelTypeEnum
1011
import models.street.StreetEdgeIssue
1112
import models.user._
1213
import play.api.libs.json._
@@ -18,6 +19,7 @@ import service.ExploreTaskPostReturnValue
1819
import java.time.OffsetDateTime
1920
import javax.inject.{Inject, Singleton}
2021
import scala.concurrent.{ExecutionContext, Future}
22+
import scala.util.{Failure, Success}
2123

2224
@Singleton
2325
class ExploreController @Inject() (
@@ -26,7 +28,8 @@ class ExploreController @Inject() (
2628
val config: Configuration,
2729
configService: service.ConfigService,
2830
exploreService: service.ExploreService,
29-
missionService: service.MissionService
31+
missionService: service.MissionService,
32+
aiService: service.AiService
3033
)(implicit ec: ExecutionContext, assets: AssetsFinder)
3134
extends CustomBaseController(cc) {
3235

@@ -237,14 +240,23 @@ class ExploreController @Inject() (
237240
interaction.note, interaction.temporaryLabelId, interaction.timestamp)
238241
})
239242
.map { _ =>
243+
// Send label info to Sidewalk AI API for AI validation async. AI API only available for some label types.
244+
val labelsToSend = returnData.newLabels.filter(l => LabelTypeEnum.aiLabelTypes.contains(l._3))
245+
aiService
246+
.validateLabelsWithAi(labelsToSend.map(_._1))
247+
.onComplete {
248+
case Success(_) => logger.info("AI validation completed successfully.")
249+
case Failure(e) => logger.error("Error recalculating street priority", e)
250+
}
251+
240252
// Send contributions to SciStarter async so that it can be recorded in their user dashboard there.
241253
val eligibleUser: Boolean = RoleTable.SCISTARTER_ROLES.contains(user.role)
242254
if (returnData.newLabels.nonEmpty && config.get[String]("environment-type") == "prod" && eligibleUser) {
243255
exploreService
244256
.secondsSpentAuditing(
245257
user.userId,
246258
returnData.newLabels.map(_._1).min,
247-
returnData.newLabels.map(_._3).max
259+
returnData.newLabels.map(_._4).max
248260
)
249261
.flatMap { timeSpent: Float =>
250262
configService.sendSciStarterContributions(user.email, returnData.newLabels.length, timeSpent)

app/controllers/GalleryController.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class GalleryController @Inject() (
5252
val jsonList: Seq[JsObject] = labels.map(l =>
5353
Json.obj(
5454
"label" -> LabelFormats.validationLabelMetadataToJson(l),
55-
"imageUrl" -> gsvDataService.getImageUrl(l.gsvPanoramaId, l.heading, l.pitch, l.zoom)
55+
"imageUrl" -> gsvDataService.getImageUrl(l.gsvPanoramaId, l.pov.heading, l.pov.pitch, l.pov.zoom)
5656
)
5757
)
5858
val labelList: JsObject = Json.obj("labelsOfType" -> jsonList)

app/controllers/UserProfileController.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class UserProfileController @Inject() (
113113
userService.getLabelLocations(userId, regionId).map { labels =>
114114
val features: Seq[JsObject] = labels.map { label =>
115115
Json.obj(
116-
"type" -> "Feature",
116+
"type" -> "Feature",
117117
"geometry" -> Json.obj(
118118
"type" -> "Point",
119119
"coordinates" -> Json.arr(label.lng.toDouble, label.lat.toDouble)
@@ -150,7 +150,8 @@ class UserProfileController @Inject() (
150150
labelService.getRecentValidatedLabelsForUser(userId, labelTypes, n).map { validations =>
151151
val validationJson = Json.toJson(labelTypes.map { labelType =>
152152
labelType -> validations(labelType).map { l =>
153-
val imageUrl: String = gsvDataService.getImageUrl(l.gsvPanoramaId, l.heading, l.pitch, l.zoom)
153+
val imageUrl: String =
154+
gsvDataService.getImageUrl(l.gsvPanoramaId, l.pov.heading, l.pov.pitch, l.pov.zoom)
154155
labelMetadataUserDashToJson(l, imageUrl)
155156
}
156157
}.toMap)

app/controllers/api/LabelApiController.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,6 @@ class LabelApiController @Inject() (
281281
* @return Asynchronous result containing an HTTP response with a JSON array of pano IDs and their associated labels.
282282
*/
283283
def getAllPanoIdsWithLabels = Action.async {
284-
gsvDataService.getAllPanosWithLabels.map { panos => Ok(Json.toJson(panos.map(p => Json.toJson(p)))) }
284+
gsvDataService.getAllPanos.map { panos => Ok(Json.toJson(panos.map(p => Json.toJson(p)))) }
285285
}
286286
}

app/formats/json/AdminFormats.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ object AdminFormats {
6868
(__ \ "count").write[Int] and
6969
(__ \ "time_interval").write[TimeInterval] and
7070
(__ \ "label_type").write[String] and
71-
(__ \ "result").write[String]
71+
(__ \ "result").write[String] and
72+
(__ \ "validator").write[String]
7273
)(unlift(ValidationCount.unapply))
7374

7475
implicit val genericCommentWrites: Writes[GenericComment] = (

app/formats/json/ApiFormats.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@ object ApiFormats {
346346

347347
implicit val gsvDataSlimWrites: Writes[GsvDataSlim] = (
348348
(__ \ "gsv_panorama_id").write[String] and
349+
(__ \ "has_labels").write[Boolean] and
349350
(__ \ "width").writeNullable[Int] and
350351
(__ \ "height").writeNullable[Int] and
351352
(__ \ "lat").writeNullable[Float] and

app/formats/json/LabelFormats.scala

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ object LabelFormats {
5959
(__ \ "temporary").write[Boolean] and
6060
(__ \ "description").write[Option[String]] and
6161
(__ \ "user_validation").write[Option[Int]] and
62+
(__ \ "ai_validation").write[Option[Int]] and
6263
(__ \ "validations").write[Map[String, Int]] and
6364
(__ \ "tags").write[List[String]] and
6465
(__ \ "low_quality_incomplete_stale_flags").write[(Boolean, Boolean, Boolean)] and
@@ -79,9 +80,9 @@ object LabelFormats {
7980
"lng" -> labelMetadata.lng,
8081
"camera_lat" -> labelMetadata.cameraLat,
8182
"camera_lng" -> labelMetadata.cameraLng,
82-
"heading" -> labelMetadata.heading,
83-
"pitch" -> labelMetadata.pitch,
84-
"zoom" -> labelMetadata.zoom,
83+
"heading" -> labelMetadata.pov.heading,
84+
"pitch" -> labelMetadata.pov.pitch,
85+
"zoom" -> labelMetadata.pov.zoom,
8586
"canvas_x" -> labelMetadata.canvasXY.x,
8687
"canvas_y" -> labelMetadata.canvasXY.y,
8788
"severity" -> labelMetadata.severity,
@@ -94,7 +95,9 @@ object LabelFormats {
9495
"disagree_count" -> labelMetadata.validationInfo.disagreeCount,
9596
"unsure_count" -> labelMetadata.validationInfo.unsureCount,
9697
"user_validation" -> labelMetadata.userValidation.map(LabelValidationTable.validationOptions.get),
98+
"ai_validation" -> labelMetadata.aiValidation.map(LabelValidationTable.validationOptions.get),
9799
"tags" -> labelMetadata.tags,
100+
"ai_tags" -> labelMetadata.aiTags,
98101
"admin_data" -> adminData.map(ad =>
99102
Json.obj(
100103
"username" -> ad.username,
@@ -129,6 +132,7 @@ object LabelFormats {
129132
"temporary" -> labelMetadata.temporary,
130133
"description" -> labelMetadata.description,
131134
"user_validation" -> labelMetadata.userValidation.map(LabelValidationTable.validationOptions.get),
135+
"ai_validation" -> labelMetadata.aiValidation.map(LabelValidationTable.validationOptions.get),
132136
"num_agree" -> labelMetadata.validations("agree"),
133137
"num_disagree" -> labelMetadata.validations("disagree"),
134138
"num_unsure" -> labelMetadata.validations("unsure"),
@@ -163,9 +167,9 @@ object LabelFormats {
163167
Json.obj(
164168
"label_id" -> label.labelId,
165169
"gsv_panorama_id" -> label.gsvPanoramaId,
166-
"heading" -> label.heading,
167-
"pitch" -> label.pitch,
168-
"zoom" -> label.zoom,
170+
"heading" -> label.pov.heading,
171+
"pitch" -> label.pov.pitch,
172+
"zoom" -> label.pov.zoom,
169173
"canvas_x" -> label.canvasX,
170174
"canvas_y" -> label.canvasY,
171175
"label_type" -> label.labelType,

0 commit comments

Comments
 (0)