private void CancelRequest(string line) { CancelRequestDetails cRD = JsonConvert.DeserializeObject <CancelRequestDetails>(line); new BoggleService().CancelJoinRequest(cRD, out HttpStatusCode status); String result = CreateResult(null, status); ss.BeginSend(result, (x, y) => { ss.Shutdown(System.Net.Sockets.SocketShutdown.Both); }, null); }
// TODO: TEST & Add GameState to Game public void CancelJoinRequest(CancelRequestDetails cancelRequestDetails, out HttpStatusCode status) { lock (sync) { using (SqlConnection connection = new SqlConnection(BoggleDB)) { connection.Open(); // Transaction for databse commands using (SqlTransaction transaction = connection.BeginTransaction()) { using (SqlCommand command = new SqlCommand( "select * from Games where Player1 = @UserID and Player2 is NULL", connection, transaction)) { command.Parameters.AddWithValue("@UserID", cancelRequestDetails.UserToken); using (SqlDataReader reader = command.ExecuteReader()) { if (!reader.HasRows) { // No pending game status = Forbidden; reader.Close(); transaction.Commit(); return; } } } using (SqlCommand command = new SqlCommand( "delete from Games where Player1 = @UserID", connection, transaction)) { command.Parameters.AddWithValue("@UserID", cancelRequestDetails.UserToken); if (command.ExecuteNonQuery() != 1) { throw new Exception("Query failed unexpectedly"); } } status = OK; transaction.Commit(); } } } }