class PostMongoHandler: RequestHandler {
    func handleRequest(request: WebRequest, response: WebResponse) {
        let reqData = request.postBodyString    // get the request body
        let jsonDecoder = JSONDecoder() // JSON decoder
        do {
            let json = try jsonDecoder.decode(reqData) as! JSONDictionaryType
            print("received request JSON: \(json.dictionary)")
            
            let userName = json.dictionary["userName"] as? String
            let firstName = json.dictionary["firstName"] as? String
            let lastName = json.dictionary["lastName"] as? String
            
            guard userName != nil else {
                // bad request, bail out
                response.setStatus(400, message: "Bad Request")
                response.requestCompletedCallback()
                return
            }
            
            do {
                // open mongodb connection
                let client = try MongoClient(uri: MONGODB_HOST)
                defer {
                    client.close()
                }
                let status = client.serverStatus()
                switch status {
                case .Error:
                    response.setStatus(500, message: "Server Error")
                    response.requestCompletedCallback()
                    return
                case .ReplyDoc:
                    //Success
                    let db = client.getDatabase(DATABASE)
                    let collection = db.getCollection(TABLE)
                    let bson = BSON()
                    defer {
                        bson.close()
                        collection.close()
                        db.close()
                    }
                    bson.append("userName", string: userName!)
                    bson.append("firstName", string: firstName!)
                    bson.append("lastName", string: lastName!)
                    
                    let result = collection.save(bson)
                    switch result {
                    case .Success:
                        response.setStatus(201, message: "Created")
                    default:
                        response.setStatus(501, message: "Insert Error")
                    }
                default:
                    response.setStatus(500, message: "Unknown Error!")
                    response.requestCompletedCallback()
                    return
                }
            } catch {
                print("error decoding json from data: \(reqData)")
                response.setStatus(401, message: "Connection error!")
            }
        } catch {
            print("error decoding json from data: \(reqData)")
            response.setStatus(400, message: "Bad Request")
        }
        
        // this completes the request and sends the response to the client
        response.requestCompletedCallback()
    }
}