func (ac *AccountControllerImpl) deleteAccount(w http.ResponseWriter, r *http.Request) {
	if user := ac.currentUser.Get(r); user != nil {
		db := ac.database.Get(r)

		analytics := new(models.Analytics)
		analytics.AddDeletedUser(user, db)

		user.Delete(db)
	}
	ac.session.Delete(r, "UserID")
	http.Redirect(w, r, "/", http.StatusFound)
}
func (sc *SearchControllerImpl) get(w http.ResponseWriter, r *http.Request) (searchResult, error) {
	services := new(models.Services)
	query := r.FormValue("q")
	if query == "" {
		return searchResult{services, 0}, nil
	}

	var limit int
	var err error

	if limit, err = strconv.Atoi(r.FormValue("limit")); err != nil {
		limit = 11
	}

	if limit > 50 {
		limit = 50
	}

	var skip int
	if skip, err = strconv.Atoi(r.FormValue("skip")); err != nil {
		skip = 0
	}

	var total int
	db := sc.database.Get(r)
	if total, err = services.FindRelevant(query, limit, skip, db); err != nil {
		return searchResult{}, errors.New("Database error: " + err.Error())
	}

	var userID bson.ObjectId
	if user := sc.currentUser.Get(r); user != nil {
		userID = user.ID
	}

	analytics := new(models.Analytics)
	analytics.AddSearch(query, limit, userID, db)

	return searchResult{services, total}, nil
}
func (rc *ReferralCodeControllerImpl) create(w http.ResponseWriter, r *http.Request) {
	body, _ := ioutil.ReadAll(r.Body)
	var values map[string]string
	json.Unmarshal(body, &values)

	// verify serviceID
	rawServiceID := values["serviceId"]
	if !bson.IsObjectIdHex(rawServiceID) {
		rc.renderer.JSON(w, http.StatusBadRequest, map[string]string{
			"error": "Bad service ID",
		})
		return
	}

	db := rc.database.Get(r)
	service := new(models.Service)
	serviceID := bson.ObjectIdHex(rawServiceID)
	if err := service.FindByID(serviceID, db); err != nil || !service.ID.Valid() {
		rc.renderer.JSON(w, http.StatusBadRequest, map[string]string{
			"error": "Bad service request",
		})
		return
	}

	userID := rc.currentUser.Get(r).ID
	code := values["code"]
	refCode := new(models.ReferralCode)
	if refCode.FindByUserAndService(userID, serviceID, db); refCode.ID.Valid() {
		if code == "" {
			analytics := new(models.Analytics)
			defer analytics.AddDeletedReferralCode(refCode, db)
			defer refCode.Delete(db)

			rc.renderer.JSON(w, http.StatusOK, nil)
			return
		}

		if err := refCode.Edit(code, db); err != nil {
			rc.renderer.JSON(w, http.StatusBadRequest, map[string]string{
				"error": err.Error(),
			})
			return
		}
	} else {
		if code == "" {
			rc.renderer.JSON(w, http.StatusBadRequest, map[string]string{
				"error": "Empty referral code not allowed",
			})
			return
		}
		refCode = models.NewReferralCode(code, rc.currentUser.Get(r).ID, service.ID)
		if err := refCode.Save(db); err != nil {
			rc.renderer.JSON(w, http.StatusBadRequest, map[string]string{
				"error": err.Error(),
			})
			return
		}
	}

	rc.renderer.JSON(w, http.StatusCreated, refCode)
}