Exemple #1
0
func Meddler() martini.Handler {
	return func(res http.ResponseWriter, r *http.Request, c martini.Context) {
		res.Header().Add("Access-Control-Allow-Origin", "*")
		if strings.ToLower(r.Method) == "options" {
			return
		}

		if strings.Contains(r.URL.String(), "favicon") {
			res.Write([]byte(""))
			return
		}
		start := time.Now()

		excused := false
		for _, route := range ExcusedRoutes {
			if strings.Contains(r.URL.String(), route) {
				excused = true
			}
		}

		// check if we need to make a call
		// to the shopping cart middleware
		if strings.Contains(strings.ToLower(r.URL.Path), "/shopify/account") { // account perms
			if strings.ToLower(r.URL.Path) == "/shopify/account/login" || (strings.ToLower(r.Method) == "post" && strings.ToLower(r.URL.Path) == "/shopify/account") {
				shopID := r.URL.Query().Get("shop")
				var crt cart.Shop
				if bson.IsObjectIdHex(shopID) {
					crt.Id = bson.ObjectIdHex(shopID)
				}
				c.Map(&crt)
			} else if err := mapCartAccount(c, res, r); err != nil {
				apierror.GenerateError("", err, res, r)
				return
			}
			excused = true
		} else if strings.Contains(strings.ToLower(r.URL.Path), "/shopify") { // shop perms
			if err := mapCart(c, res, r); err != nil {
				apierror.GenerateError("", err, res, r)
				return
			}
			excused = true
		}

		if !excused {
			dataContext, err := processDataContext(r, c)
			if err != nil {
				apierror.GenerateError("Trouble processing the data context", err, res, r, http.StatusUnauthorized)
				return
			}
			c.Map(dataContext)
		}

		c.Next()
		go logRequest(r, time.Since(start))
	}
}