diff --git a/jvm/src/main/scala/cs214/webapp/server/web/WebServerRoutes.scala b/jvm/src/main/scala/cs214/webapp/server/web/WebServerRoutes.scala index 430d2d72f5ecde0fb924561378c8651ae0c7a24a..a98eb3caf6fba0f730324b947bd5460660167506 100644 --- a/jvm/src/main/scala/cs214/webapp/server/web/WebServerRoutes.scala +++ b/jvm/src/main/scala/cs214/webapp/server/web/WebServerRoutes.scala @@ -4,7 +4,7 @@ package web import java.net.InetAddress import scala.jdk.CollectionConverters.* -import scala.util.Try +import scala.util.{Try, Success, Failure} import cask.endpoints.JsonData import decorators.checkOriginHeader @@ -51,8 +51,8 @@ private[server] final case class WebServerRoutes()(using cc: castor.Context, log ListAppsResponse.Wire.encode(ListAppsResponse(WebServer.appDirectory.values.map(_.appInfo).toSeq)) @cask.getJson(f"${Endpoints.Api.instanceInfo}") - def getAppInfo(instanceId: InstanceId) = - val response: cask.Response[JsonData] = WebServer.instances.get(instanceId) match + def getAppInfo(instanceId: InstanceId): cask.Response[JsonData] = + WebServer.instances.get(instanceId) match case Some(inst) => val authority = if Config.PUBLIC_INSTANCE then "{{authority}}" else f"$hostAddress:${Config.HTTP_PORT}" val shareUrl = f"{{protocol}}://$authority${Endpoints.App}/${inst.appInfo.id}/$instanceId/" @@ -60,25 +60,25 @@ private[server] final case class WebServerRoutes()(using cc: castor.Context, log val response = InstanceInfoResponse(instanceId, inst.registeredUserIds, wsEndpoint, shareUrl) InstanceInfoResponse.Wire.encode(response) case None => - cask.Response(f"Unknown instance id $instanceId", 400) - response + cask.Response(f"Unknown instance '$instanceId'", 400) @cask.post(f"${Endpoints.Api.createInstance}") - def postInitApp(request: cask.Request) = - val response: cask.Response[JsonData] = - val req = CreateInstanceRequest.Wire.decode(ujson.read(request.text())) - if req.isFailure then + def postInitApp(request: cask.Request): cask.Response[JsonData] = + CreateInstanceRequest.Wire.decode(ujson.read(request.text())) match + case Failure(_) => cask.Response(f"Unable to decode data: ${request.text()}", 400) - else - val appId = WebServer.createInstance(req.get.appName, req.get.userIds) - CreateInstanceResponse.Wire.encode(CreateInstanceResponse(appId)) - response + case Success(CreateInstanceRequest(appName, userIds)) => + if WebServer.appDirectory.contains(appName) then + val appId = WebServer.createInstance(appName, userIds) + CreateInstanceResponse.Wire.encode(CreateInstanceResponse(appId)) + else + cask.Response(f"Unknown app '$appName'", 400) @checkOriginHeader @cask.websocket(f"${Endpoints.WebSocket}/:instanceId/:userId") def websocket(instanceId: String, userId: String, request: cask.Request): cask.WebsocketResult = WebServer.instances.get(instanceId) match case Some(app) => app.connect(userId) - case None => cask.Response(f"Unknown instance id $instanceId", 400) + case None => cask.Response(f"Unknown instance '$instanceId'", 400) initialize()