public ApiModule( ControllerFactory controllerFactory ) : base("/api") { Get["/raceinfo"] = parameters => { try { return Response.AsJson( GetRaceInfo( controllerFactory ) ); } catch ( Exception ex ) { return Response.AsJson(ex.Message, HttpStatusCode.InternalServerError); } }; Get["/runner"] = parameters => { var number = Request.Query["number"]; var runner = GetRunner( controllerFactory, number ); var statusCode = HttpStatusCode.OK; if ( runner == null ) { statusCode = HttpStatusCode.InternalServerError; } return Response.AsJson( new {runner = runner}, statusCode); }; Get["/runners"] = parameters => Response.AsJson( GetRunners( controllerFactory ) ); Get["/results"] = parameters => { try { var resultsToList = 0; int.TryParse( Request.Query["resultsToList"], out resultsToList ); if ( resultsToList == 0 ) { resultsToList = int.MaxValue; } return Response.AsJson( GetResults( controllerFactory, resultsToList ) ); } catch ( Exception ex ) { return HandleException(ex); } }; Get["/result"] = parameters => { var position = Request.Query["position"]; var raceResult = GetResult(controllerFactory, position); var statusCode = HttpStatusCode.OK; if (raceResult == null) { statusCode = HttpStatusCode.InternalServerError; } return Response.AsJson(new { raceResult = raceResult }, statusCode); }; Post["/updateresult"] = ( x ) => { var appController = controllerFactory.AppController; var message = ""; var statusCode = HttpStatusCode.OK; try { var newResult = this.Bind<NewResult>(); var result = new Result() { Position = newResult.Position, RaceNumber = newResult.RaceNumber, Time = new TimeSpan( newResult.Hours, newResult.Minutes, newResult.Seconds ), }; appController.UpdateResult( result ); return Response.AsJson(message, statusCode); } catch (Exception ex) { return HandleException(ex); } }; Post["/addresult"] = ( x ) => { var appController = controllerFactory.AppController; var message = ""; var statusCode = HttpStatusCode.OK; try { var newResult = this.Bind<NewResult>(); var result = new Result() { Position = newResult.Position, RaceNumber = newResult.RaceNumber, Time = new TimeSpan( newResult.Hours, newResult.Minutes, newResult.Seconds ), }; appController.InsertResult( result ); return Response.AsJson( message, statusCode ); } catch ( Exception ex ) { return HandleException( ex ); } }; Post["/deleteresult"] = ( x ) => { var appController = controllerFactory.AppController; var message = ""; var statusCode = HttpStatusCode.OK; try { var deleteResult = this.Bind<DeleteResult>(); // Neither selected if ( !deleteResult.DeleteNumber && !deleteResult.DeleteTime ) { throw new Exception("Nothing selected to delete..."); } // Both selected if ( deleteResult.DeleteNumber && deleteResult.DeleteTime ) { appController.DeleteResultAtPosition( deleteResult.Position ); } // Delete just the number - shifting numbers down else if ( deleteResult.DeleteNumber && !deleteResult.DeleteTime ) { appController.DeleteRunnerNumberShiftDown(deleteResult.Position); } // Delete the result time, shifting times down else if (!deleteResult.DeleteNumber && deleteResult.DeleteTime) { appController.DeleteTimeShiftDown(deleteResult.Position); } return Response.AsJson(message, statusCode); } catch (Exception ex) { return HandleException( ex ); } }; Get["/finishers"] = parameters => Response.AsJson( GetFinishers( controllerFactory ) ); Get["/winners"] = parameters => Response.AsJson( GetWinners( controllerFactory ) ); Get["/teams"] = parameters => Response.AsJson( GetTeams( controllerFactory ) ); Post["/addrunner"] = ( x ) => { var appController = controllerFactory.AppController; var message = ""; var statusCode = HttpStatusCode.OK; try { var newRunner = this.Bind<NewRunner>(); // Check fields CheckField( newRunner.FirstName, "First Name" ); CheckField( newRunner.LastName, "Last Name" ); CheckField( newRunner.Gender, "Gender" ); CheckField( newRunner.DoB, "DoB" ); int number; if ( !int.TryParse( newRunner.Number, out number ) ) { throw new Exception( "Race number format is incorrect." ); } var runners = appController.GetRunners(); if ( runners.Any( r => r.Number == number ) ) { throw new Exception("A runner with this number already exists."); } var runner = new Runner { FirstName = newRunner.FirstName, LastName = newRunner.LastName, Gender = ( newRunner.Gender == "F" ) ? GenderEnum.Female : GenderEnum.Male, DateOfBirth = DateTime.Parse( newRunner.DoB ), Email = newRunner.Email, Number = number, Club = newRunner.Club, Team = newRunner.Team, Urn = newRunner.Urn, }; runner.ToUpperCase(); var db = appController.DbService; if ( !db.TestDuplicate( runner ) ) { db.AddRunner( runner ); message = string.Format( "'{0}' added to database OK.", runner.ToString() ); } else { throw new Exception(string.Format("'{0}' with this DoB already exists in database.", runner.ToString())); } return Response.AsJson( message, statusCode ); } catch ( Exception ex ) { return HandleException(ex); } }; Post["/updaterunner"] = ( x ) => { var appController = controllerFactory.AppController; var message = ""; var statusCode = HttpStatusCode.OK; try { var newRunner = this.Bind<NewRunner>(); // Check fields CheckField( newRunner.FirstName, "First Name" ); CheckField( newRunner.LastName, "Last Name" ); CheckField( newRunner.Gender, "Gender" ); CheckField( newRunner.DoB, "DoB" ); int number; if ( !int.TryParse( newRunner.Number, out number ) ) { throw new Exception( "Race number format is incorrect." ); } int newNumber = 0; var haveNewNumber = false; if ( !string.IsNullOrEmpty( newRunner.NewNumber ) ) { if ( !int.TryParse( newRunner.NewNumber, out newNumber ) ) { throw new Exception( "The format of the new race number is not correct." ); } haveNewNumber = true; } // Update var runner = new Runner { Number = number, FirstName = newRunner.FirstName, LastName = newRunner.LastName, Gender = ( newRunner.Gender == "Female" ) ? GenderEnum.Female : GenderEnum.Male, DateOfBirth = DateTime.Parse( newRunner.DoB ), Email = newRunner.Email, Club = newRunner.Club, Team = newRunner.Team, Urn = newRunner.Urn, HaveNewNumber = haveNewNumber, NewNumber = newNumber, }; runner.ToUpperCase(); appController.DbService.UpdateRunner( runner ); return Response.AsJson( message, statusCode ); } catch ( Exception ex ) { return HandleException( ex ); } }; Post["/deleterunner"] = ( x ) => { var appController = controllerFactory.AppController; var message = ""; var statusCode = HttpStatusCode.OK; try { var number = this.Bind<RunnerNumber>(); appController.DbService.DeleteRunner(number.Number); Trace.WriteLineIf( AppController.traceSwitch.TraceInfo, string.Format( "Runner with number {0} deleted.", number.Number ) ); return Response.AsJson( message, statusCode ); } catch ( Exception ex ) { return HandleException(ex); } }; Post["/addfinishposition"] = ( x ) => { var appController = controllerFactory.AppController; var message = ""; var statusCode = HttpStatusCode.OK; try { var posResult = this.Bind<PositionResult>(); if ( !appController.IsClockRunning ) { throw new Exception( "Race is not in progress (clock not running)." ); } if ( posResult.Position <= 0 ) { message = "Race number must be > 0"; statusCode = HttpStatusCode.BadRequest; } else { appController.AddResultRunnerNumber( posResult.Position ); Trace.WriteLineIf( AppController.traceSwitch.TraceInfo, "Runner number added: " + posResult.Position ); } return Response.AsJson( message, statusCode ); } catch ( Exception ex ) { return HandleException( ex ); } }; }