Как получить данные по текущему контекстному пользователю при использовании GORM - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть следующие отношения:

package models

import (
    "github.com/jinzhu/gorm"
)

type User struct {
    gorm.Model
    Site      Site
}


type Site struct {
    gorm.Model
    UserID    string
    Pageviews []Pageview
}

type Pageview struct {
    gorm.Model
    Site         Site
    SiteID       string
    Hostname     string `gorm:"not null"`
    Pathname     string `gorm:"not null"`
    IsNewVisitor bool   `gorm:"not null"`
    IsNewSession bool   `gorm:"not null"`
    IsUnique     bool   `gorm:"not null"`
    IsBounce     bool   `gorm:"not null"`
    IsFinished   bool   `gorm:"not null"`
    Referrer     string `gorm:"not null"`
    Duration     int64  `gorm:"not null"`
}

И, как правило, в таких средах, как Rails, выполняемые вами запросы ограничены пользовательским контекстом. Например:

GET / pageviews -> вернуть все просмотры страницы от текущего пользователя.

То же самое относится к Fathom, например:

func (api *API) GetSiteStatsPageviewsHandler(w http.ResponseWriter, r *http.Request) error {
    params := GetRequestParams(r)
    result, err := api.database.GetTotalSiteViews(params.SiteID, params.StartDate, params.EndDate)
    if err != nil {
        return err
    }
    return respond(w, http.StatusOK, envelope{Data: result})
}

Код в здесь .

Теперь: как я могу сделать то же самое в лямбде? В настоящее время я должен объявить связь между утверждением, что просмотр страницы принадлежит пользователю (или у пользователя есть много просмотров страниц), и затем:

func (p *Pageview) FindAll(userId string, siteID string) ([]byte, error) {
    p.UserID = userID
    p.SiteID = siteID

    db.Find(p)
    return json.Marshal(p)
}

когда я хочу:

func (p *Pageview) FindAll(siteID string) ([]byte, error) {
    p.SiteID = siteID

    db.Find(p)
    return json.Marshal(p)
}

Есть ли другой способ, которым я могу это сделать, не объявляя об отношениях?

Я никогда не спрашивал себя, как можно сделать ограничение запроса текущим пользователем, не объявляя его в самом запросе. Может быть, если я понимаю, я могу подражать тому же поведению.

...