mirror of
https://github.com/dnote/dnote
synced 2026-03-16 15:35:52 +01:00
Rename database to models
This commit is contained in:
parent
541ca72417
commit
e514f43770
73 changed files with 550 additions and 550 deletions
2
Makefile
2
Makefile
|
|
@ -176,7 +176,7 @@ ifndef filename
|
|||
$(error filename is required. Usage: make filename=your-filename create-migration)
|
||||
endif
|
||||
|
||||
@(cd ${currentDir}/pkg/server/database && ./scripts/create-migration.sh $(filename))
|
||||
@(cd ${currentDir}/pkg/server/models && ./scripts/create-migration.sh $(filename))
|
||||
.PHONY: create-migration
|
||||
|
||||
clean:
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ This guide documents the steps for installing the Dnote server on your own machi
|
|||
|
||||
## Overview
|
||||
|
||||
Dnote server comes as a single binary file that you can simply download and run. It uses Postgres as the database.
|
||||
Dnote server comes as a single binary file that you can simply download and run. It uses Postgres as the models.
|
||||
|
||||
## Installation
|
||||
|
||||
|
|
@ -37,7 +37,7 @@ DisableRegistration=false
|
|||
dnote-server start
|
||||
```
|
||||
|
||||
Replace `$user`, `$password` with the credentials of the Postgres user that owns the `dnote` database.
|
||||
Replace `$user`, `$password` with the credentials of the Postgres user that owns the `dnote` models.
|
||||
|
||||
Replace `$webURL` with the full URL to your server, without a trailing slash (e.g. `https://your.server`).
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import (
|
|||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/handlers"
|
||||
"github.com/dnote/dnote/pkg/server/helpers"
|
||||
"github.com/dnote/dnote/pkg/server/log"
|
||||
|
|
@ -40,13 +40,13 @@ type GetMeResponse struct {
|
|||
}
|
||||
|
||||
func (a *API) getMe(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
handlers.DoError(w, "No authenticated user found", nil, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
var account database.Account
|
||||
var account models.Account
|
||||
if err := a.App.DB.Where("user_id = ?", user.ID).First(&account).Error; err != nil {
|
||||
handlers.DoError(w, "finding account", err, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -77,7 +77,7 @@ func (a *API) createResetToken(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
var account database.Account
|
||||
var account models.Account
|
||||
conn := a.App.DB.Where("email = ?", params.Email).First(&account)
|
||||
if conn.RecordNotFound() {
|
||||
return
|
||||
|
|
@ -87,7 +87,7 @@ func (a *API) createResetToken(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
resetToken, err := token.Create(a.App.DB, account.UserID, database.TokenTypeResetPassword)
|
||||
resetToken, err := token.Create(a.App.DB, account.UserID, models.TokenTypeResetPassword)
|
||||
if err != nil {
|
||||
handlers.DoError(w, errors.Wrap(err, "generating token").Error(), nil, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -116,8 +116,8 @@ func (a *API) resetPassword(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
var token database.Token
|
||||
conn := a.App.DB.Where("value = ? AND type =? AND used_at IS NULL", params.Token, database.TokenTypeResetPassword).First(&token)
|
||||
var token models.Token
|
||||
conn := a.App.DB.Where("value = ? AND type =? AND used_at IS NULL", params.Token, models.TokenTypeResetPassword).First(&token)
|
||||
if conn.RecordNotFound() {
|
||||
http.Error(w, "invalid token", http.StatusBadRequest)
|
||||
return
|
||||
|
|
@ -147,7 +147,7 @@ func (a *API) resetPassword(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
var account database.Account
|
||||
var account models.Account
|
||||
if err := a.App.DB.Where("user_id = ?", token.UserID).First(&account).Error; err != nil {
|
||||
tx.Rollback()
|
||||
handlers.DoError(w, errors.Wrap(err, "finding user").Error(), nil, http.StatusInternalServerError)
|
||||
|
|
@ -173,7 +173,7 @@ func (a *API) resetPassword(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
tx.Commit()
|
||||
|
||||
var user database.User
|
||||
var user models.User
|
||||
if err := a.App.DB.Where("id = ?", account.UserID).First(&user).Error; err != nil {
|
||||
handlers.DoError(w, errors.Wrap(err, "finding user").Error(), nil, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ import (
|
|||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/clock"
|
||||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/session"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
"github.com/pkg/errors"
|
||||
|
|
@ -53,8 +53,8 @@ func TestGetMe(t *testing.T) {
|
|||
a2 := testutils.SetupAccountData(u2, "bob@example.com", "somepassword")
|
||||
|
||||
testCases := []struct {
|
||||
user database.User
|
||||
account database.Account
|
||||
user models.User
|
||||
account models.Account
|
||||
expectedPro bool
|
||||
}{
|
||||
{
|
||||
|
|
@ -93,7 +93,7 @@ func TestGetMe(t *testing.T) {
|
|||
}
|
||||
assert.DeepEqual(t, payload, expectedPayload, "payload mismatch")
|
||||
|
||||
var user database.User
|
||||
var user models.User
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", tc.user.ID).First(&user), "finding user")
|
||||
assert.NotEqual(t, user.LastLoginAt, nil, "LastLoginAt mismatch")
|
||||
})
|
||||
|
|
@ -124,10 +124,10 @@ func TestCreateResetToken(t *testing.T) {
|
|||
assert.StatusCodeEquals(t, res, http.StatusOK, "Status code mismtach")
|
||||
|
||||
var tokenCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Token{}).Count(&tokenCount), "counting tokens")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Token{}).Count(&tokenCount), "counting tokens")
|
||||
|
||||
var resetToken database.Token
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ? AND type = ?", u.ID, database.TokenTypeResetPassword).First(&resetToken), "finding reset token")
|
||||
var resetToken models.Token
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ? AND type = ?", u.ID, models.TokenTypeResetPassword).First(&resetToken), "finding reset token")
|
||||
|
||||
assert.Equal(t, tokenCount, 1, "reset_token count mismatch")
|
||||
assert.NotEqual(t, resetToken.Value, nil, "reset_token value mismatch")
|
||||
|
|
@ -158,7 +158,7 @@ func TestCreateResetToken(t *testing.T) {
|
|||
assert.StatusCodeEquals(t, res, http.StatusOK, "Status code mismtach")
|
||||
|
||||
var tokenCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Token{}).Count(&tokenCount), "counting tokens")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Token{}).Count(&tokenCount), "counting tokens")
|
||||
assert.Equal(t, tokenCount, 0, "reset_token count mismatch")
|
||||
})
|
||||
}
|
||||
|
|
@ -176,30 +176,30 @@ func TestResetPassword(t *testing.T) {
|
|||
|
||||
u := testutils.SetupUserData()
|
||||
a := testutils.SetupAccountData(u, "alice@example.com", "oldpassword")
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: u.ID,
|
||||
Value: "MivFxYiSMMA4An9dP24DNQ==",
|
||||
Type: database.TokenTypeResetPassword,
|
||||
Type: models.TokenTypeResetPassword,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&tok), "preparing token")
|
||||
otherTok := database.Token{
|
||||
otherTok := models.Token{
|
||||
UserID: u.ID,
|
||||
Value: "somerandomvalue",
|
||||
Type: database.TokenTypeEmailVerification,
|
||||
Type: models.TokenTypeEmailVerification,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&otherTok), "preparing another token")
|
||||
|
||||
dat := `{"token": "MivFxYiSMMA4An9dP24DNQ==", "password": "newpassword"}`
|
||||
req := testutils.MakeReq(server.URL, "PATCH", "/reset-password", dat)
|
||||
|
||||
s1 := database.Session{
|
||||
s1 := models.Session{
|
||||
Key: "some-session-key-1",
|
||||
UserID: u.ID,
|
||||
ExpiresAt: time.Now().Add(time.Hour * 10 * 24),
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&s1), "preparing user session 1")
|
||||
|
||||
s2 := &database.Session{
|
||||
s2 := &models.Session{
|
||||
Key: "some-session-key-2",
|
||||
UserID: u.ID,
|
||||
ExpiresAt: time.Now().Add(time.Hour * 10 * 24),
|
||||
|
|
@ -207,7 +207,7 @@ func TestResetPassword(t *testing.T) {
|
|||
testutils.MustExec(t, testutils.DB.Save(&s2), "preparing user session 2")
|
||||
|
||||
anotherUser := testutils.SetupUserData()
|
||||
testutils.MustExec(t, testutils.DB.Save(&database.Session{
|
||||
testutils.MustExec(t, testutils.DB.Save(&models.Session{
|
||||
Key: "some-session-key-3",
|
||||
UserID: anotherUser.ID,
|
||||
ExpiresAt: time.Now().Add(time.Hour * 10 * 24),
|
||||
|
|
@ -219,8 +219,8 @@ func TestResetPassword(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusOK, "Status code mismatch")
|
||||
|
||||
var resetToken, verificationToken database.Token
|
||||
var account database.Account
|
||||
var resetToken, verificationToken models.Token
|
||||
var account models.Account
|
||||
testutils.MustExec(t, testutils.DB.Where("value = ?", "MivFxYiSMMA4An9dP24DNQ==").First(&resetToken), "finding reset token")
|
||||
testutils.MustExec(t, testutils.DB.Where("value = ?", "somerandomvalue").First(&verificationToken), "finding reset token")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", a.ID).First(&account), "finding account")
|
||||
|
|
@ -231,15 +231,15 @@ func TestResetPassword(t *testing.T) {
|
|||
assert.Equal(t, verificationToken.UsedAt, (*time.Time)(nil), "verificationToken UsedAt mismatch")
|
||||
|
||||
var s1Count, s2Count int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Session{}).Where("id = ?", s1.ID).Count(&s1Count), "counting s1")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Session{}).Where("id = ?", s2.ID).Count(&s2Count), "counting s2")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Session{}).Where("id = ?", s1.ID).Count(&s1Count), "counting s1")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Session{}).Where("id = ?", s2.ID).Count(&s2Count), "counting s2")
|
||||
|
||||
assert.Equal(t, s1Count, 0, "s1 should have been deleted")
|
||||
assert.Equal(t, s2Count, 0, "s2 should have been deleted")
|
||||
|
||||
var userSessionCount, anotherUserSessionCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Session{}).Where("user_id = ?", u.ID).Count(&userSessionCount), "counting user session")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Session{}).Where("user_id = ?", anotherUser.ID).Count(&anotherUserSessionCount), "counting anotherUser session")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Session{}).Where("user_id = ?", u.ID).Count(&userSessionCount), "counting user session")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Session{}).Where("user_id = ?", anotherUser.ID).Count(&anotherUserSessionCount), "counting anotherUser session")
|
||||
|
||||
assert.Equal(t, userSessionCount, 1, "should have created a new user session")
|
||||
assert.Equal(t, anotherUserSessionCount, 1, "anotherUser session count mismatch")
|
||||
|
|
@ -257,10 +257,10 @@ func TestResetPassword(t *testing.T) {
|
|||
|
||||
u := testutils.SetupUserData()
|
||||
a := testutils.SetupAccountData(u, "alice@example.com", "somepassword")
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: u.ID,
|
||||
Value: "MivFxYiSMMA4An9dP24DNQ==",
|
||||
Type: database.TokenTypeResetPassword,
|
||||
Type: models.TokenTypeResetPassword,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&tok), "preparing token")
|
||||
|
||||
|
|
@ -273,8 +273,8 @@ func TestResetPassword(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusBadRequest, "Status code mismatch")
|
||||
|
||||
var resetToken database.Token
|
||||
var account database.Account
|
||||
var resetToken models.Token
|
||||
var account models.Account
|
||||
testutils.MustExec(t, testutils.DB.Where("value = ?", "MivFxYiSMMA4An9dP24DNQ==").First(&resetToken), "finding reset token")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", a.ID).First(&account), "finding account")
|
||||
|
||||
|
|
@ -295,10 +295,10 @@ func TestResetPassword(t *testing.T) {
|
|||
|
||||
u := testutils.SetupUserData()
|
||||
a := testutils.SetupAccountData(u, "alice@example.com", "somepassword")
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: u.ID,
|
||||
Value: "MivFxYiSMMA4An9dP24DNQ==",
|
||||
Type: database.TokenTypeResetPassword,
|
||||
Type: models.TokenTypeResetPassword,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&tok), "preparing token")
|
||||
testutils.MustExec(t, testutils.DB.Model(&tok).Update("created_at", time.Now().Add(time.Minute*-11)), "Failed to prepare reset_token created_at")
|
||||
|
|
@ -312,8 +312,8 @@ func TestResetPassword(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusGone, "Status code mismatch")
|
||||
|
||||
var resetToken database.Token
|
||||
var account database.Account
|
||||
var resetToken models.Token
|
||||
var account models.Account
|
||||
testutils.MustExec(t, testutils.DB.Where("value = ?", "MivFxYiSMMA4An9dP24DNQ==").First(&resetToken), "failed to find reset_token")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", a.ID).First(&account), "failed to find account")
|
||||
assert.Equal(t, a.Password, account.Password, "password should not have been updated")
|
||||
|
|
@ -334,10 +334,10 @@ func TestResetPassword(t *testing.T) {
|
|||
a := testutils.SetupAccountData(u, "alice@example.com", "somepassword")
|
||||
|
||||
usedAt := time.Now().Add(time.Hour * -11).UTC()
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: u.ID,
|
||||
Value: "MivFxYiSMMA4An9dP24DNQ==",
|
||||
Type: database.TokenTypeResetPassword,
|
||||
Type: models.TokenTypeResetPassword,
|
||||
UsedAt: &usedAt,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&tok), "preparing token")
|
||||
|
|
@ -352,8 +352,8 @@ func TestResetPassword(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusBadRequest, "Status code mismatch")
|
||||
|
||||
var resetToken database.Token
|
||||
var account database.Account
|
||||
var resetToken models.Token
|
||||
var account models.Account
|
||||
testutils.MustExec(t, testutils.DB.Where("value = ?", "MivFxYiSMMA4An9dP24DNQ==").First(&resetToken), "failed to find reset_token")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", a.ID).First(&account), "failed to find account")
|
||||
assert.Equal(t, a.Password, account.Password, "password should not have been updated")
|
||||
|
|
@ -380,10 +380,10 @@ func TestResetPassword(t *testing.T) {
|
|||
|
||||
u := testutils.SetupUserData()
|
||||
a := testutils.SetupAccountData(u, "alice@example.com", "somepassword")
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: u.ID,
|
||||
Value: "MivFxYiSMMA4An9dP24DNQ==",
|
||||
Type: database.TokenTypeEmailVerification,
|
||||
Type: models.TokenTypeEmailVerification,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&tok), "Failed to prepare reset_token")
|
||||
testutils.MustExec(t, testutils.DB.Model(&tok).Update("created_at", time.Now().Add(time.Minute*-11)), "Failed to prepare reset_token created_at")
|
||||
|
|
@ -397,8 +397,8 @@ func TestResetPassword(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusBadRequest, "Status code mismatch")
|
||||
|
||||
var resetToken database.Token
|
||||
var account database.Account
|
||||
var resetToken models.Token
|
||||
var account models.Account
|
||||
testutils.MustExec(t, testutils.DB.Where("value = ?", "MivFxYiSMMA4An9dP24DNQ==").First(&resetToken), "failed to find reset_token")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", a.ID).First(&account), "failed to find account")
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ import (
|
|||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
|
@ -41,7 +41,7 @@ func paginate(conn *gorm.DB, page int) *gorm.DB {
|
|||
return conn
|
||||
}
|
||||
|
||||
func getBookIDs(books []database.Book) []int {
|
||||
func getBookIDs(books []models.Book) []int {
|
||||
ret := []int{}
|
||||
|
||||
for _, book := range books {
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ import (
|
|||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/handlers"
|
||||
"github.com/dnote/dnote/pkg/server/helpers"
|
||||
"github.com/dnote/dnote/pkg/server/operations"
|
||||
|
|
@ -75,7 +75,7 @@ ts_headline('english_nostop', notes.body, plainto_tsquery('english_nostop', ?),
|
|||
`, search, headlineOpts)
|
||||
}
|
||||
|
||||
func respondWithNote(w http.ResponseWriter, note database.Note) {
|
||||
func respondWithNote(w http.ResponseWriter, note models.Note) {
|
||||
presentedNote := presenters.PresentNote(note)
|
||||
|
||||
handlers.RespondJSON(w, http.StatusOK, presentedNote)
|
||||
|
|
@ -137,7 +137,7 @@ type dateRange struct {
|
|||
}
|
||||
|
||||
func (a *API) getNotes(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
handlers.DoError(w, "No authenticated user found", nil, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -157,15 +157,15 @@ func respondGetNotes(db *gorm.DB, userID int, query url.Values, w http.ResponseW
|
|||
conn := getNotesBaseQuery(db, userID, q)
|
||||
|
||||
var total int
|
||||
if err := conn.Model(database.Note{}).Count(&total).Error; err != nil {
|
||||
if err := conn.Model(models.Note{}).Count(&total).Error; err != nil {
|
||||
handlers.DoError(w, "counting total", err, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
notes := []database.Note{}
|
||||
notes := []models.Note{}
|
||||
if total != 0 {
|
||||
conn = orderGetNotes(conn)
|
||||
conn = database.PreloadNote(conn)
|
||||
conn = models.PreloadNote(conn)
|
||||
conn = paginate(conn, q.Page)
|
||||
|
||||
if err := conn.Find(¬es).Error; err != nil {
|
||||
|
|
@ -307,13 +307,13 @@ func escapeSearchQuery(searchQuery string) string {
|
|||
}
|
||||
|
||||
func (a *API) legacyGetNotes(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
handlers.DoError(w, "No authenticated user found", nil, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
var notes []database.Note
|
||||
var notes []models.Note
|
||||
if err := a.App.DB.Where("user_id = ? AND encrypted = true", user.ID).Find(¬es).Error; err != nil {
|
||||
handlers.DoError(w, "finding notes", err, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
|
|||
|
|
@ -29,13 +29,13 @@ import (
|
|||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/clock"
|
||||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/presenters"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
func getExpectedNotePayload(n database.Note, b database.Book, u database.User) presenters.Note {
|
||||
func getExpectedNotePayload(n models.Note, b models.Book, u models.User) presenters.Note {
|
||||
return presenters.Note{
|
||||
UUID: n.UUID,
|
||||
CreatedAt: n.CreatedAt,
|
||||
|
|
@ -66,23 +66,23 @@ func TestGetNotes(t *testing.T) {
|
|||
user := testutils.SetupUserData()
|
||||
anotherUser := testutils.SetupUserData()
|
||||
|
||||
b1 := database.Book{
|
||||
b1 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: "js",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), "preparing b1")
|
||||
b2 := database.Book{
|
||||
b2 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: "css",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b2), "preparing b2")
|
||||
b3 := database.Book{
|
||||
b3 := models.Book{
|
||||
UserID: anotherUser.ID,
|
||||
Label: "css",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b3), "preparing b3")
|
||||
|
||||
n1 := database.Note{
|
||||
n1 := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b1.UUID,
|
||||
Body: "n1 content",
|
||||
|
|
@ -91,7 +91,7 @@ func TestGetNotes(t *testing.T) {
|
|||
AddedOn: time.Date(2018, time.August, 10, 23, 0, 0, 0, time.UTC).UnixNano(),
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&n1), "preparing n1")
|
||||
n2 := database.Note{
|
||||
n2 := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b1.UUID,
|
||||
Body: "n2 content",
|
||||
|
|
@ -100,7 +100,7 @@ func TestGetNotes(t *testing.T) {
|
|||
AddedOn: time.Date(2018, time.August, 11, 22, 0, 0, 0, time.UTC).UnixNano(),
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&n2), "preparing n2")
|
||||
n3 := database.Note{
|
||||
n3 := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b1.UUID,
|
||||
Body: "n3 content",
|
||||
|
|
@ -109,7 +109,7 @@ func TestGetNotes(t *testing.T) {
|
|||
AddedOn: time.Date(2017, time.January, 10, 23, 0, 0, 0, time.UTC).UnixNano(),
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&n3), "preparing n3")
|
||||
n4 := database.Note{
|
||||
n4 := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b2.UUID,
|
||||
Body: "n4 content",
|
||||
|
|
@ -118,7 +118,7 @@ func TestGetNotes(t *testing.T) {
|
|||
AddedOn: time.Date(2018, time.September, 10, 23, 0, 0, 0, time.UTC).UnixNano(),
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&n4), "preparing n4")
|
||||
n5 := database.Note{
|
||||
n5 := models.Note{
|
||||
UserID: anotherUser.ID,
|
||||
BookUUID: b3.UUID,
|
||||
Body: "n5 content",
|
||||
|
|
@ -127,7 +127,7 @@ func TestGetNotes(t *testing.T) {
|
|||
AddedOn: time.Date(2018, time.August, 10, 23, 0, 0, 0, time.UTC).UnixNano(),
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&n5), "preparing n5")
|
||||
n6 := database.Note{
|
||||
n6 := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b1.UUID,
|
||||
Body: "",
|
||||
|
|
@ -149,7 +149,7 @@ func TestGetNotes(t *testing.T) {
|
|||
t.Fatal(errors.Wrap(err, "decoding payload"))
|
||||
}
|
||||
|
||||
var n2Record, n1Record database.Note
|
||||
var n2Record, n1Record models.Note
|
||||
testutils.MustExec(t, testutils.DB.Where("uuid = ?", n2.UUID).First(&n2Record), "finding n2Record")
|
||||
testutils.MustExec(t, testutils.DB.Where("uuid = ?", n1.UUID).First(&n1Record), "finding n1Record")
|
||||
|
||||
|
|
@ -176,27 +176,27 @@ func TestGetNote(t *testing.T) {
|
|||
user := testutils.SetupUserData()
|
||||
anotherUser := testutils.SetupUserData()
|
||||
|
||||
b1 := database.Book{
|
||||
b1 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: "js",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), "preparing b1")
|
||||
|
||||
privateNote := database.Note{
|
||||
privateNote := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b1.UUID,
|
||||
Body: "privateNote content",
|
||||
Public: false,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&privateNote), "preparing privateNote")
|
||||
publicNote := database.Note{
|
||||
publicNote := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b1.UUID,
|
||||
Body: "publicNote content",
|
||||
Public: true,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&publicNote), "preparing publicNote")
|
||||
deletedNote := database.Note{
|
||||
deletedNote := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b1.UUID,
|
||||
Deleted: true,
|
||||
|
|
@ -217,7 +217,7 @@ func TestGetNote(t *testing.T) {
|
|||
t.Fatal(errors.Wrap(err, "decoding payload"))
|
||||
}
|
||||
|
||||
var n1Record database.Note
|
||||
var n1Record models.Note
|
||||
testutils.MustExec(t, testutils.DB.Where("uuid = ?", privateNote.UUID).First(&n1Record), "finding n1Record")
|
||||
|
||||
expected := getExpectedNotePayload(n1Record, b1, user)
|
||||
|
|
@ -238,7 +238,7 @@ func TestGetNote(t *testing.T) {
|
|||
t.Fatal(errors.Wrap(err, "decoding payload"))
|
||||
}
|
||||
|
||||
var n2Record database.Note
|
||||
var n2Record models.Note
|
||||
testutils.MustExec(t, testutils.DB.Where("uuid = ?", publicNote.UUID).First(&n2Record), "finding n2Record")
|
||||
|
||||
expected := getExpectedNotePayload(n2Record, b1, user)
|
||||
|
|
@ -259,7 +259,7 @@ func TestGetNote(t *testing.T) {
|
|||
t.Fatal(errors.Wrap(err, "decoding payload"))
|
||||
}
|
||||
|
||||
var n2Record database.Note
|
||||
var n2Record models.Note
|
||||
testutils.MustExec(t, testutils.DB.Where("uuid = ?", publicNote.UUID).First(&n2Record), "finding n2Record")
|
||||
|
||||
expected := getExpectedNotePayload(n2Record, b1, user)
|
||||
|
|
@ -297,7 +297,7 @@ func TestGetNote(t *testing.T) {
|
|||
t.Fatal(errors.Wrap(err, "decoding payload"))
|
||||
}
|
||||
|
||||
var n2Record database.Note
|
||||
var n2Record models.Note
|
||||
testutils.MustExec(t, testutils.DB.Where("uuid = ?", publicNote.UUID).First(&n2Record), "finding n2Record")
|
||||
|
||||
expected := getExpectedNotePayload(n2Record, b1, user)
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import (
|
|||
"os"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/handlers"
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/pkg/errors"
|
||||
|
|
@ -73,8 +73,8 @@ func NewRouter(a *API) (*mux.Router, error) {
|
|||
{Method: "PATCH", Pattern: "/reset-password", HandlerFunc: a.resetPassword, RateLimit: true},
|
||||
{Method: "PATCH", Pattern: "/account/profile", HandlerFunc: handlers.Auth(app, a.updateProfile, nil), RateLimit: true},
|
||||
{Method: "PATCH", Pattern: "/account/password", HandlerFunc: handlers.Auth(app, a.updatePassword, nil), RateLimit: true},
|
||||
{Method: "GET", Pattern: "/account/email-preference", HandlerFunc: handlers.TokenAuth(app, a.getEmailPreference, database.TokenTypeEmailPreference, nil), RateLimit: true},
|
||||
{Method: "PATCH", Pattern: "/account/email-preference", HandlerFunc: handlers.TokenAuth(app, a.updateEmailPreference, database.TokenTypeEmailPreference, nil), RateLimit: true},
|
||||
{Method: "GET", Pattern: "/account/email-preference", HandlerFunc: handlers.TokenAuth(app, a.getEmailPreference, models.TokenTypeEmailPreference, nil), RateLimit: true},
|
||||
{Method: "PATCH", Pattern: "/account/email-preference", HandlerFunc: handlers.TokenAuth(app, a.updateEmailPreference, models.TokenTypeEmailPreference, nil), RateLimit: true},
|
||||
{Method: "GET", Pattern: "/notes", HandlerFunc: handlers.Auth(app, a.getNotes, nil), RateLimit: false},
|
||||
{Method: "GET", Pattern: "/notes/{noteUUID}", HandlerFunc: a.getNote, RateLimit: true},
|
||||
{Method: "GET", Pattern: "/calendar", HandlerFunc: handlers.Auth(app, a.getCalendar, nil), RateLimit: true},
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import (
|
|||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/handlers"
|
||||
"github.com/dnote/dnote/pkg/server/helpers"
|
||||
"github.com/dnote/dnote/pkg/server/log"
|
||||
|
|
@ -43,13 +43,13 @@ type updateProfilePayload struct {
|
|||
|
||||
// updateProfile updates user
|
||||
func (a *API) updateProfile(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
handlers.DoError(w, "No authenticated user found", nil, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
var account database.Account
|
||||
var account models.Account
|
||||
if err := a.App.DB.Where("user_id = ?", user.ID).First(&account).Error; err != nil {
|
||||
handlers.DoError(w, "getting account", nil, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -135,7 +135,7 @@ func respondWithCalendar(db *gorm.DB, w http.ResponseWriter, userID int) {
|
|||
}
|
||||
|
||||
func (a *API) getCalendar(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
handlers.DoError(w, "No authenticated user found", nil, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -145,13 +145,13 @@ func (a *API) getCalendar(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
|
||||
func (a *API) createVerificationToken(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
handlers.DoError(w, "No authenticated user found", nil, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
var account database.Account
|
||||
var account models.Account
|
||||
err := a.App.DB.Where("user_id = ?", user.ID).First(&account).Error
|
||||
if err != nil {
|
||||
handlers.DoError(w, "finding account", err, http.StatusInternalServerError)
|
||||
|
|
@ -167,7 +167,7 @@ func (a *API) createVerificationToken(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
tok, err := token.Create(a.App.DB, account.UserID, database.TokenTypeEmailVerification)
|
||||
tok, err := token.Create(a.App.DB, account.UserID, models.TokenTypeEmailVerification)
|
||||
if err != nil {
|
||||
handlers.DoError(w, "saving token", err, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -197,9 +197,9 @@ func (a *API) verifyEmail(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
var token database.Token
|
||||
var token models.Token
|
||||
if err := a.App.DB.
|
||||
Where("value = ? AND type = ?", params.Token, database.TokenTypeEmailVerification).
|
||||
Where("value = ? AND type = ?", params.Token, models.TokenTypeEmailVerification).
|
||||
First(&token).Error; err != nil {
|
||||
http.Error(w, "invalid token", http.StatusBadRequest)
|
||||
return
|
||||
|
|
@ -216,7 +216,7 @@ func (a *API) verifyEmail(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
var account database.Account
|
||||
var account models.Account
|
||||
if err := a.App.DB.Where("user_id = ?", token.UserID).First(&account).Error; err != nil {
|
||||
handlers.DoError(w, "finding account", err, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -240,7 +240,7 @@ func (a *API) verifyEmail(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
tx.Commit()
|
||||
|
||||
var user database.User
|
||||
var user models.User
|
||||
if err := a.App.DB.Where("id = ?", token.UserID).First(&user).Error; err != nil {
|
||||
handlers.DoError(w, "finding user", err, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -272,7 +272,7 @@ func (p emailPreferernceParams) getProductUpdate() bool {
|
|||
}
|
||||
|
||||
func (a *API) updateEmailPreference(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
handlers.DoError(w, "No authenticated user found", nil, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -284,8 +284,8 @@ func (a *API) updateEmailPreference(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
var pref database.EmailPreference
|
||||
if err := a.App.DB.Where(database.EmailPreference{UserID: user.ID}).FirstOrCreate(&pref).Error; err != nil {
|
||||
var pref models.EmailPreference
|
||||
if err := a.App.DB.Where(models.EmailPreference{UserID: user.ID}).FirstOrCreate(&pref).Error; err != nil {
|
||||
handlers.DoError(w, "finding pref", err, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
|
@ -305,7 +305,7 @@ func (a *API) updateEmailPreference(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
token, ok := r.Context().Value(helpers.KeyToken).(database.Token)
|
||||
token, ok := r.Context().Value(helpers.KeyToken).(models.Token)
|
||||
if ok {
|
||||
// Mark token as used if the user was authenticated by token
|
||||
if err := tx.Model(&token).Update("used_at", time.Now()).Error; err != nil {
|
||||
|
|
@ -321,14 +321,14 @@ func (a *API) updateEmailPreference(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
|
||||
func (a *API) getEmailPreference(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
handlers.DoError(w, "No authenticated user found", nil, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
var pref database.EmailPreference
|
||||
if err := a.App.DB.Where(database.EmailPreference{UserID: user.ID}).First(&pref).Error; err != nil {
|
||||
var pref models.EmailPreference
|
||||
if err := a.App.DB.Where(models.EmailPreference{UserID: user.ID}).First(&pref).Error; err != nil {
|
||||
handlers.DoError(w, "finding pref", err, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
|
@ -343,7 +343,7 @@ type updatePasswordPayload struct {
|
|||
}
|
||||
|
||||
func (a *API) updatePassword(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
handlers.DoError(w, "No authenticated user found", nil, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -359,7 +359,7 @@ func (a *API) updatePassword(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
var account database.Account
|
||||
var account models.Account
|
||||
if err := a.App.DB.Where("user_id = ?", user.ID).First(&account).Error; err != nil {
|
||||
handlers.DoError(w, "getting account", nil, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ import (
|
|||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/clock"
|
||||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/presenters"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
"github.com/pkg/errors"
|
||||
|
|
@ -56,7 +56,7 @@ func TestUpdatePassword(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusOK, "Status code mismsatch")
|
||||
|
||||
var account database.Account
|
||||
var account models.Account
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", user.ID).First(&account), "finding account")
|
||||
|
||||
passwordErr := bcrypt.CompareHashAndPassword([]byte(account.Password.String), []byte("newpassword"))
|
||||
|
|
@ -84,7 +84,7 @@ func TestUpdatePassword(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusUnauthorized, "Status code mismsatch")
|
||||
|
||||
var account database.Account
|
||||
var account models.Account
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", u.ID).First(&account), "finding account")
|
||||
assert.Equal(t, a.Password.String, account.Password.String, "password should not have been updated")
|
||||
})
|
||||
|
|
@ -110,7 +110,7 @@ func TestUpdatePassword(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusBadRequest, "Status code mismsatch")
|
||||
|
||||
var account database.Account
|
||||
var account models.Account
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", u.ID).First(&account), "finding account")
|
||||
assert.Equal(t, a.Password.String, account.Password.String, "password should not have been updated")
|
||||
})
|
||||
|
|
@ -138,12 +138,12 @@ func TestCreateVerificationToken(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusCreated, "status code mismatch")
|
||||
|
||||
var account database.Account
|
||||
var token database.Token
|
||||
var account models.Account
|
||||
var token models.Token
|
||||
var tokenCount int
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", user.ID).First(&account), "finding account")
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ? AND type = ?", user.ID, database.TokenTypeEmailVerification).First(&token), "finding token")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Token{}).Count(&tokenCount), "counting token")
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ? AND type = ?", user.ID, models.TokenTypeEmailVerification).First(&token), "finding token")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Token{}).Count(&tokenCount), "counting token")
|
||||
|
||||
assert.Equal(t, account.EmailVerified, false, "email_verified should not have been updated")
|
||||
assert.NotEqual(t, token.Value, "", "token Value mismatch")
|
||||
|
|
@ -175,10 +175,10 @@ func TestCreateVerificationToken(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusGone, "Status code mismatch")
|
||||
|
||||
var account database.Account
|
||||
var account models.Account
|
||||
var tokenCount int
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", user.ID).First(&account), "finding account")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Token{}).Count(&tokenCount), "counting token")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Token{}).Count(&tokenCount), "counting token")
|
||||
|
||||
assert.Equal(t, account.EmailVerified, true, "email_verified should not have been updated")
|
||||
assert.Equal(t, tokenCount, 0, "token count mismatch")
|
||||
|
|
@ -198,9 +198,9 @@ func TestVerifyEmail(t *testing.T) {
|
|||
|
||||
user := testutils.SetupUserData()
|
||||
testutils.SetupAccountData(user, "alice@example.com", "pass1234")
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: user.ID,
|
||||
Type: database.TokenTypeEmailVerification,
|
||||
Type: models.TokenTypeEmailVerification,
|
||||
Value: "someTokenValue",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&tok), "preparing token")
|
||||
|
|
@ -214,12 +214,12 @@ func TestVerifyEmail(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusOK, "Status code mismatch")
|
||||
|
||||
var account database.Account
|
||||
var token database.Token
|
||||
var account models.Account
|
||||
var token models.Token
|
||||
var tokenCount int
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", user.ID).First(&account), "finding account")
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ? AND type = ?", user.ID, database.TokenTypeEmailVerification).First(&token), "finding token")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Token{}).Count(&tokenCount), "counting token")
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ? AND type = ?", user.ID, models.TokenTypeEmailVerification).First(&token), "finding token")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Token{}).Count(&tokenCount), "counting token")
|
||||
|
||||
assert.Equal(t, account.EmailVerified, true, "email_verified mismatch")
|
||||
assert.NotEqual(t, token.Value, "", "token value should not have been updated")
|
||||
|
|
@ -241,9 +241,9 @@ func TestVerifyEmail(t *testing.T) {
|
|||
testutils.SetupAccountData(user, "alice@example.com", "pass1234")
|
||||
|
||||
usedAt := time.Now().Add(time.Hour * -11).UTC()
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: user.ID,
|
||||
Type: database.TokenTypeEmailVerification,
|
||||
Type: models.TokenTypeEmailVerification,
|
||||
Value: "someTokenValue",
|
||||
UsedAt: &usedAt,
|
||||
}
|
||||
|
|
@ -258,12 +258,12 @@ func TestVerifyEmail(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusBadRequest, "")
|
||||
|
||||
var account database.Account
|
||||
var token database.Token
|
||||
var account models.Account
|
||||
var token models.Token
|
||||
var tokenCount int
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", user.ID).First(&account), "finding account")
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ? AND type = ?", user.ID, database.TokenTypeEmailVerification).First(&token), "finding token")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Token{}).Count(&tokenCount), "counting token")
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ? AND type = ?", user.ID, models.TokenTypeEmailVerification).First(&token), "finding token")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Token{}).Count(&tokenCount), "counting token")
|
||||
|
||||
assert.Equal(t, account.EmailVerified, false, "email_verified mismatch")
|
||||
assert.NotEqual(t, token.UsedAt, nil, "token used_at mismatch")
|
||||
|
|
@ -284,9 +284,9 @@ func TestVerifyEmail(t *testing.T) {
|
|||
user := testutils.SetupUserData()
|
||||
testutils.SetupAccountData(user, "alice@example.com", "pass1234")
|
||||
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: user.ID,
|
||||
Type: database.TokenTypeEmailVerification,
|
||||
Type: models.TokenTypeEmailVerification,
|
||||
Value: "someTokenValue",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&tok), "preparing token")
|
||||
|
|
@ -301,12 +301,12 @@ func TestVerifyEmail(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusGone, "")
|
||||
|
||||
var account database.Account
|
||||
var token database.Token
|
||||
var account models.Account
|
||||
var token models.Token
|
||||
var tokenCount int
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", user.ID).First(&account), "finding account")
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ? AND type = ?", user.ID, database.TokenTypeEmailVerification).First(&token), "finding token")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Token{}).Count(&tokenCount), "counting token")
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ? AND type = ?", user.ID, models.TokenTypeEmailVerification).First(&token), "finding token")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Token{}).Count(&tokenCount), "counting token")
|
||||
|
||||
assert.Equal(t, account.EmailVerified, false, "email_verified mismatch")
|
||||
assert.Equal(t, tokenCount, 1, "token count mismatch")
|
||||
|
|
@ -328,9 +328,9 @@ func TestVerifyEmail(t *testing.T) {
|
|||
a.EmailVerified = true
|
||||
testutils.MustExec(t, testutils.DB.Save(&a), "preparing account")
|
||||
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: user.ID,
|
||||
Type: database.TokenTypeEmailVerification,
|
||||
Type: models.TokenTypeEmailVerification,
|
||||
Value: "someTokenValue",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&tok), "preparing token")
|
||||
|
|
@ -344,12 +344,12 @@ func TestVerifyEmail(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusConflict, "")
|
||||
|
||||
var account database.Account
|
||||
var token database.Token
|
||||
var account models.Account
|
||||
var token models.Token
|
||||
var tokenCount int
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", user.ID).First(&account), "finding account")
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ? AND type = ?", user.ID, database.TokenTypeEmailVerification).First(&token), "finding token")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Token{}).Count(&tokenCount), "counting token")
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ? AND type = ?", user.ID, models.TokenTypeEmailVerification).First(&token), "finding token")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Token{}).Count(&tokenCount), "counting token")
|
||||
|
||||
assert.Equal(t, account.EmailVerified, true, "email_verified mismatch")
|
||||
assert.Equal(t, tokenCount, 1, "token count mismatch")
|
||||
|
|
@ -380,8 +380,8 @@ func TestUpdateEmail(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusOK, "")
|
||||
|
||||
var user database.User
|
||||
var account database.Account
|
||||
var user models.User
|
||||
var account models.Account
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", u.ID).First(&user), "finding user")
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", u.ID).First(&account), "finding account")
|
||||
|
||||
|
|
@ -411,8 +411,8 @@ func TestUpdateEmail(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusUnauthorized, "Status code mismsatch")
|
||||
|
||||
var user database.User
|
||||
var account database.Account
|
||||
var user models.User
|
||||
var account models.Account
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", u.ID).First(&user), "finding user")
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", u.ID).First(&account), "finding account")
|
||||
|
||||
|
|
@ -442,7 +442,7 @@ func TestUpdateEmailPreference(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusOK, "")
|
||||
|
||||
var preference database.EmailPreference
|
||||
var preference models.EmailPreference
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", u.ID).First(&preference), "finding account")
|
||||
assert.Equal(t, preference.InactiveReminder, true, "preference mismatch")
|
||||
})
|
||||
|
|
@ -458,9 +458,9 @@ func TestUpdateEmailPreference(t *testing.T) {
|
|||
|
||||
u := testutils.SetupUserData()
|
||||
testutils.SetupEmailPreferenceData(u, false)
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: u.ID,
|
||||
Type: database.TokenTypeEmailPreference,
|
||||
Type: models.TokenTypeEmailPreference,
|
||||
Value: "someTokenValue",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&tok), "preparing token")
|
||||
|
|
@ -474,11 +474,11 @@ func TestUpdateEmailPreference(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusOK, "")
|
||||
|
||||
var preference database.EmailPreference
|
||||
var preference models.EmailPreference
|
||||
var preferenceCount int
|
||||
var token database.Token
|
||||
var token models.Token
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", u.ID).First(&preference), "finding preference")
|
||||
testutils.MustExec(t, testutils.DB.Model(database.EmailPreference{}).Count(&preferenceCount), "counting preference")
|
||||
testutils.MustExec(t, testutils.DB.Model(models.EmailPreference{}).Count(&preferenceCount), "counting preference")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", tok.ID).First(&token), "failed to find token")
|
||||
|
||||
assert.Equal(t, preferenceCount, 1, "preference count mismatch")
|
||||
|
|
@ -497,9 +497,9 @@ func TestUpdateEmailPreference(t *testing.T) {
|
|||
|
||||
u := testutils.SetupUserData()
|
||||
testutils.SetupEmailPreferenceData(u, true)
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: u.ID,
|
||||
Type: database.TokenTypeEmailPreference,
|
||||
Type: models.TokenTypeEmailPreference,
|
||||
Value: "someTokenValue",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&tok), "preparing token")
|
||||
|
|
@ -514,7 +514,7 @@ func TestUpdateEmailPreference(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusUnauthorized, "")
|
||||
|
||||
var preference database.EmailPreference
|
||||
var preference models.EmailPreference
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", u.ID).First(&preference), "finding preference")
|
||||
assert.Equal(t, preference.InactiveReminder, true, "email mismatch")
|
||||
})
|
||||
|
|
@ -533,9 +533,9 @@ func TestUpdateEmailPreference(t *testing.T) {
|
|||
testutils.SetupEmailPreferenceData(u, true)
|
||||
|
||||
usedAt := time.Now().Add(-11 * time.Minute)
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: u.ID,
|
||||
Type: database.TokenTypeEmailPreference,
|
||||
Type: models.TokenTypeEmailPreference,
|
||||
Value: "someTokenValue",
|
||||
UsedAt: &usedAt,
|
||||
}
|
||||
|
|
@ -550,7 +550,7 @@ func TestUpdateEmailPreference(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusUnauthorized, "")
|
||||
|
||||
var preference database.EmailPreference
|
||||
var preference models.EmailPreference
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", u.ID).First(&preference), "finding preference")
|
||||
assert.Equal(t, preference.InactiveReminder, true, "email mismatch")
|
||||
})
|
||||
|
|
@ -569,9 +569,9 @@ func TestUpdateEmailPreference(t *testing.T) {
|
|||
u := testutils.SetupUserData()
|
||||
testutils.SetupEmailPreferenceData(u, true)
|
||||
usedAt := time.Now().Add(-9 * time.Minute)
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: u.ID,
|
||||
Type: database.TokenTypeEmailPreference,
|
||||
Type: models.TokenTypeEmailPreference,
|
||||
Value: "someTokenValue",
|
||||
UsedAt: &usedAt,
|
||||
}
|
||||
|
|
@ -587,7 +587,7 @@ func TestUpdateEmailPreference(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusOK, "")
|
||||
|
||||
var preference database.EmailPreference
|
||||
var preference models.EmailPreference
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", u.ID).First(&preference), "finding preference")
|
||||
assert.Equal(t, preference.InactiveReminder, false, "InactiveReminder mismatch")
|
||||
})
|
||||
|
|
@ -614,7 +614,7 @@ func TestUpdateEmailPreference(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusUnauthorized, "")
|
||||
|
||||
var preference database.EmailPreference
|
||||
var preference models.EmailPreference
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", u.ID).First(&preference), "finding preference")
|
||||
assert.Equal(t, preference.InactiveReminder, true, "email mismatch")
|
||||
})
|
||||
|
|
@ -631,9 +631,9 @@ func TestUpdateEmailPreference(t *testing.T) {
|
|||
defer server.Close()
|
||||
|
||||
u := testutils.SetupUserData()
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: u.ID,
|
||||
Type: database.TokenTypeEmailPreference,
|
||||
Type: models.TokenTypeEmailPreference,
|
||||
Value: "someTokenValue",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&tok), "preparing token")
|
||||
|
|
@ -648,10 +648,10 @@ func TestUpdateEmailPreference(t *testing.T) {
|
|||
assert.StatusCodeEquals(t, res, http.StatusOK, "")
|
||||
|
||||
var preferenceCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(database.EmailPreference{}).Count(&preferenceCount), "counting preference")
|
||||
testutils.MustExec(t, testutils.DB.Model(models.EmailPreference{}).Count(&preferenceCount), "counting preference")
|
||||
assert.Equal(t, preferenceCount, 1, "preference count mismatch")
|
||||
|
||||
var preference database.EmailPreference
|
||||
var preference models.EmailPreference
|
||||
testutils.MustExec(t, testutils.DB.Where("user_id = ?", u.ID).First(&preference), "finding preference")
|
||||
assert.Equal(t, preference.InactiveReminder, false, "email mismatch")
|
||||
})
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import (
|
|||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/handlers"
|
||||
"github.com/dnote/dnote/pkg/server/log"
|
||||
"github.com/jinzhu/gorm"
|
||||
|
|
@ -51,9 +51,9 @@ func setSessionCookie(w http.ResponseWriter, key string, expires time.Time) {
|
|||
http.SetCookie(w, &cookie)
|
||||
}
|
||||
|
||||
func touchLastLoginAt(db *gorm.DB, user database.User) error {
|
||||
func touchLastLoginAt(db *gorm.DB, user models.User) error {
|
||||
t := time.Now()
|
||||
if err := db.Model(&user).Update(database.User{LastLoginAt: &t}).Error; err != nil {
|
||||
if err := db.Model(&user).Update(models.User{LastLoginAt: &t}).Error; err != nil {
|
||||
return errors.Wrap(err, "updating last_login_at")
|
||||
}
|
||||
|
||||
|
|
@ -77,7 +77,7 @@ func (a *API) signin(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
var account database.Account
|
||||
var account models.Account
|
||||
conn := a.App.DB.Where("email = ?", params.Email).First(&account)
|
||||
if conn.RecordNotFound() {
|
||||
http.Error(w, ErrLoginFailure.Error(), http.StatusUnauthorized)
|
||||
|
|
@ -94,7 +94,7 @@ func (a *API) signin(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
var user database.User
|
||||
var user models.User
|
||||
err = a.App.DB.Where("id = ?", account.UserID).First(&user).Error
|
||||
if err != nil {
|
||||
handlers.DoError(w, "finding user", err, http.StatusInternalServerError)
|
||||
|
|
@ -179,7 +179,7 @@ func (a *API) register(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
|
||||
var count int
|
||||
if err := a.App.DB.Model(database.Account{}).Where("email = ?", params.Email).Count(&count).Error; err != nil {
|
||||
if err := a.App.DB.Model(models.Account{}).Where("email = ?", params.Email).Count(&count).Error; err != nil {
|
||||
handlers.DoError(w, "checking duplicate user", err, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ import (
|
|||
"github.com/dnote/dnote/pkg/clock"
|
||||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/config"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
"github.com/pkg/errors"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
|
|
@ -43,8 +43,8 @@ func assertSessionResp(t *testing.T, res *http.Response) {
|
|||
}
|
||||
|
||||
var sessionCount int
|
||||
var session database.Session
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Session{}).Count(&sessionCount), "counting session")
|
||||
var session models.Session
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Session{}).Count(&sessionCount), "counting session")
|
||||
testutils.MustExec(t, testutils.DB.First(&session), "getting session")
|
||||
|
||||
assert.Equal(t, sessionCount, 1, "sessionCount mismatch")
|
||||
|
|
@ -117,14 +117,14 @@ func TestRegister(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusCreated, "")
|
||||
|
||||
var account database.Account
|
||||
var account models.Account
|
||||
testutils.MustExec(t, testutils.DB.Where("email = ?", tc.email).First(&account), "finding account")
|
||||
assert.Equal(t, account.Email.String, tc.email, "Email mismatch")
|
||||
assert.NotEqual(t, account.UserID, 0, "UserID mismatch")
|
||||
passwordErr := bcrypt.CompareHashAndPassword([]byte(account.Password.String), []byte(tc.password))
|
||||
assert.Equal(t, passwordErr, nil, "Password mismatch")
|
||||
|
||||
var user database.User
|
||||
var user models.User
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", account.UserID).First(&user), "finding user")
|
||||
assert.Equal(t, user.Cloud, tc.expectedPro, "Cloud mismatch")
|
||||
assert.Equal(t, user.MaxUSN, 0, "MaxUSN mismatch")
|
||||
|
|
@ -159,8 +159,8 @@ func TestRegisterMissingParams(t *testing.T) {
|
|||
assert.StatusCodeEquals(t, res, http.StatusBadRequest, "Status mismatch")
|
||||
|
||||
var accountCount, userCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Account{}).Count(&accountCount), "counting account")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.User{}).Count(&userCount), "counting user")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Account{}).Count(&accountCount), "counting account")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.User{}).Count(&userCount), "counting user")
|
||||
|
||||
assert.Equal(t, accountCount, 0, "accountCount mismatch")
|
||||
assert.Equal(t, userCount, 0, "userCount mismatch")
|
||||
|
|
@ -186,8 +186,8 @@ func TestRegisterMissingParams(t *testing.T) {
|
|||
assert.StatusCodeEquals(t, res, http.StatusBadRequest, "Status mismatch")
|
||||
|
||||
var accountCount, userCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Account{}).Count(&accountCount), "counting account")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.User{}).Count(&userCount), "counting user")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Account{}).Count(&accountCount), "counting account")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.User{}).Count(&userCount), "counting user")
|
||||
|
||||
assert.Equal(t, accountCount, 0, "accountCount mismatch")
|
||||
assert.Equal(t, userCount, 0, "userCount mismatch")
|
||||
|
|
@ -216,11 +216,11 @@ func TestRegisterDuplicateEmail(t *testing.T) {
|
|||
assert.StatusCodeEquals(t, res, http.StatusBadRequest, "status code mismatch")
|
||||
|
||||
var accountCount, userCount, verificationTokenCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Account{}).Count(&accountCount), "counting account")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.User{}).Count(&userCount), "counting user")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Token{}).Count(&verificationTokenCount), "counting verification token")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Account{}).Count(&accountCount), "counting account")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.User{}).Count(&userCount), "counting user")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Token{}).Count(&verificationTokenCount), "counting verification token")
|
||||
|
||||
var user database.User
|
||||
var user models.User
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", u.ID).First(&user), "finding user")
|
||||
|
||||
assert.Equal(t, accountCount, 1, "account count mismatch")
|
||||
|
|
@ -252,8 +252,8 @@ func TestRegisterDisabled(t *testing.T) {
|
|||
assert.StatusCodeEquals(t, res, http.StatusForbidden, "status code mismatch")
|
||||
|
||||
var accountCount, userCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Account{}).Count(&accountCount), "counting account")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.User{}).Count(&userCount), "counting user")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Account{}).Count(&accountCount), "counting account")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.User{}).Count(&userCount), "counting user")
|
||||
|
||||
assert.Equal(t, accountCount, 0, "account count mismatch")
|
||||
assert.Equal(t, userCount, 0, "user count mismatch")
|
||||
|
|
@ -282,8 +282,8 @@ func TestSignIn(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusOK, "")
|
||||
|
||||
var user database.User
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.User{}).First(&user), "finding user")
|
||||
var user models.User
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.User{}).First(&user), "finding user")
|
||||
assert.NotEqual(t, user.LastLoginAt, nil, "LastLoginAt mismatch")
|
||||
|
||||
// after register, should sign in user
|
||||
|
|
@ -312,12 +312,12 @@ func TestSignIn(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusUnauthorized, "")
|
||||
|
||||
var user database.User
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.User{}).First(&user), "finding user")
|
||||
var user models.User
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.User{}).First(&user), "finding user")
|
||||
assert.Equal(t, user.LastLoginAt, (*time.Time)(nil), "LastLoginAt mismatch")
|
||||
|
||||
var sessionCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Session{}).Count(&sessionCount), "counting session")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Session{}).Count(&sessionCount), "counting session")
|
||||
assert.Equal(t, sessionCount, 0, "sessionCount mismatch")
|
||||
})
|
||||
|
||||
|
|
@ -344,12 +344,12 @@ func TestSignIn(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusUnauthorized, "")
|
||||
|
||||
var user database.User
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.User{}).First(&user), "finding user")
|
||||
var user models.User
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.User{}).First(&user), "finding user")
|
||||
assert.DeepEqual(t, user.LastLoginAt, (*time.Time)(nil), "LastLoginAt mismatch")
|
||||
|
||||
var sessionCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Session{}).Count(&sessionCount), "counting session")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Session{}).Count(&sessionCount), "counting session")
|
||||
assert.Equal(t, sessionCount, 0, "sessionCount mismatch")
|
||||
})
|
||||
|
||||
|
|
@ -374,7 +374,7 @@ func TestSignIn(t *testing.T) {
|
|||
assert.StatusCodeEquals(t, res, http.StatusUnauthorized, "")
|
||||
|
||||
var sessionCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Session{}).Count(&sessionCount), "counting session")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Session{}).Count(&sessionCount), "counting session")
|
||||
assert.Equal(t, sessionCount, 0, "sessionCount mismatch")
|
||||
})
|
||||
}
|
||||
|
|
@ -388,13 +388,13 @@ func TestSignout(t *testing.T) {
|
|||
testutils.SetupAccountData(aliceUser, "alice@example.com", "pass1234")
|
||||
anotherUser := testutils.SetupUserData()
|
||||
|
||||
session1 := database.Session{
|
||||
session1 := models.Session{
|
||||
Key: "A9xgggqzTHETy++GDi1NpDNe0iyqosPm9bitdeNGkJU=",
|
||||
UserID: aliceUser.ID,
|
||||
ExpiresAt: time.Now().Add(time.Hour * 24),
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&session1), "preparing session1")
|
||||
session2 := database.Session{
|
||||
session2 := models.Session{
|
||||
Key: "MDCpbvCRg7W2sH6S870wqLqZDZTObYeVd0PzOekfo/A=",
|
||||
UserID: anotherUser.ID,
|
||||
ExpiresAt: time.Now().Add(time.Hour * 24),
|
||||
|
|
@ -417,8 +417,8 @@ func TestSignout(t *testing.T) {
|
|||
assert.StatusCodeEquals(t, res, http.StatusNoContent, "Status mismatch")
|
||||
|
||||
var sessionCount int
|
||||
var s2 database.Session
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Session{}).Count(&sessionCount), "counting session")
|
||||
var s2 models.Session
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Session{}).Count(&sessionCount), "counting session")
|
||||
testutils.MustExec(t, testutils.DB.Where("key = ?", "MDCpbvCRg7W2sH6S870wqLqZDZTObYeVd0PzOekfo/A=").First(&s2), "getting s2")
|
||||
|
||||
assert.Equal(t, sessionCount, 1, "sessionCount mismatch")
|
||||
|
|
@ -440,13 +440,13 @@ func TestSignout(t *testing.T) {
|
|||
testutils.SetupAccountData(aliceUser, "alice@example.com", "pass1234")
|
||||
anotherUser := testutils.SetupUserData()
|
||||
|
||||
session1 := database.Session{
|
||||
session1 := models.Session{
|
||||
Key: "A9xgggqzTHETy++GDi1NpDNe0iyqosPm9bitdeNGkJU=",
|
||||
UserID: aliceUser.ID,
|
||||
ExpiresAt: time.Now().Add(time.Hour * 24),
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&session1), "preparing session1")
|
||||
session2 := database.Session{
|
||||
session2 := models.Session{
|
||||
Key: "MDCpbvCRg7W2sH6S870wqLqZDZTObYeVd0PzOekfo/A=",
|
||||
UserID: anotherUser.ID,
|
||||
ExpiresAt: time.Now().Add(time.Hour * 24),
|
||||
|
|
@ -468,8 +468,8 @@ func TestSignout(t *testing.T) {
|
|||
assert.StatusCodeEquals(t, res, http.StatusNoContent, "Status mismatch")
|
||||
|
||||
var sessionCount int
|
||||
var postSession1, postSession2 database.Session
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Session{}).Count(&sessionCount), "counting session")
|
||||
var postSession1, postSession2 models.Session
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Session{}).Count(&sessionCount), "counting session")
|
||||
testutils.MustExec(t, testutils.DB.Where("key = ?", "A9xgggqzTHETy++GDi1NpDNe0iyqosPm9bitdeNGkJU=").First(&postSession1), "getting postSession1")
|
||||
testutils.MustExec(t, testutils.DB.Where("key = ?", "MDCpbvCRg7W2sH6S870wqLqZDZTObYeVd0PzOekfo/A=").First(&postSession2), "getting postSession2")
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ import (
|
|||
"net/http"
|
||||
"net/url"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/handlers"
|
||||
"github.com/dnote/dnote/pkg/server/helpers"
|
||||
"github.com/dnote/dnote/pkg/server/presenters"
|
||||
|
|
@ -52,7 +52,7 @@ func validateCreateBookPayload(p createBookPayload) error {
|
|||
|
||||
// CreateBook creates a new book
|
||||
func (a *API) CreateBook(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
|
@ -71,7 +71,7 @@ func (a *API) CreateBook(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
|
||||
var bookCount int
|
||||
err = a.App.DB.Model(database.Book{}).
|
||||
err = a.App.DB.Model(models.Book{}).
|
||||
Where("user_id = ? AND label = ?", user.ID, params.Name).
|
||||
Count(&bookCount).Error
|
||||
if err != nil {
|
||||
|
|
@ -100,7 +100,7 @@ func (a *API) BooksOptions(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
|
||||
func respondWithBooks(db *gorm.DB, userID int, query url.Values, w http.ResponseWriter) {
|
||||
var books []database.Book
|
||||
var books []models.Book
|
||||
conn := db.Where("user_id = ? AND NOT deleted", userID).Order("label ASC")
|
||||
name := query.Get("name")
|
||||
encryptedStr := query.Get("encrypted")
|
||||
|
|
@ -131,7 +131,7 @@ func respondWithBooks(db *gorm.DB, userID int, query url.Values, w http.Response
|
|||
|
||||
// GetBooks returns books for the user
|
||||
func (a *API) GetBooks(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
|
@ -143,7 +143,7 @@ func (a *API) GetBooks(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
// GetBook returns a book for the user
|
||||
func (a *API) GetBook(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
|
@ -151,7 +151,7 @@ func (a *API) GetBook(w http.ResponseWriter, r *http.Request) {
|
|||
vars := mux.Vars(r)
|
||||
bookUUID := vars["bookUUID"]
|
||||
|
||||
var book database.Book
|
||||
var book models.Book
|
||||
conn := a.App.DB.Where("uuid = ? AND user_id = ?", bookUUID, user.ID).First(&book)
|
||||
|
||||
if conn.RecordNotFound() {
|
||||
|
|
@ -178,7 +178,7 @@ type UpdateBookResp struct {
|
|||
|
||||
// UpdateBook updates a book
|
||||
func (a *API) UpdateBook(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
|
@ -188,7 +188,7 @@ func (a *API) UpdateBook(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
tx := a.App.DB.Begin()
|
||||
|
||||
var book database.Book
|
||||
var book models.Book
|
||||
if err := tx.Where("user_id = ? AND uuid = ?", user.ID, uuid).First(&book).Error; err != nil {
|
||||
handlers.DoError(w, "finding book", err, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -223,7 +223,7 @@ type DeleteBookResp struct {
|
|||
|
||||
// DeleteBook removes a book
|
||||
func (a *API) DeleteBook(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
|
@ -233,13 +233,13 @@ func (a *API) DeleteBook(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
tx := a.App.DB.Begin()
|
||||
|
||||
var book database.Book
|
||||
var book models.Book
|
||||
if err := tx.Where("user_id = ? AND uuid = ?", user.ID, uuid).First(&book).Error; err != nil {
|
||||
handlers.DoError(w, "finding book", err, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
var notes []database.Note
|
||||
var notes []models.Note
|
||||
if err := tx.Where("book_uuid = ? AND NOT deleted", uuid).Order("usn ASC").Find(¬es).Error; err != nil {
|
||||
handlers.DoError(w, "finding notes", err, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ import (
|
|||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/clock"
|
||||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/presenters"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
"github.com/pkg/errors"
|
||||
|
|
@ -47,28 +47,28 @@ func TestGetBooks(t *testing.T) {
|
|||
user := testutils.SetupUserData()
|
||||
anotherUser := testutils.SetupUserData()
|
||||
|
||||
b1 := database.Book{
|
||||
b1 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: "js",
|
||||
USN: 1123,
|
||||
Deleted: false,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), "preparing b1")
|
||||
b2 := database.Book{
|
||||
b2 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: "css",
|
||||
USN: 1125,
|
||||
Deleted: false,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b2), "preparing b2")
|
||||
b3 := database.Book{
|
||||
b3 := models.Book{
|
||||
UserID: anotherUser.ID,
|
||||
Label: "css",
|
||||
USN: 1128,
|
||||
Deleted: false,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b3), "preparing b3")
|
||||
b4 := database.Book{
|
||||
b4 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: "",
|
||||
USN: 1129,
|
||||
|
|
@ -88,7 +88,7 @@ func TestGetBooks(t *testing.T) {
|
|||
t.Fatal(errors.Wrap(err, "decoding payload"))
|
||||
}
|
||||
|
||||
var b1Record, b2Record database.Book
|
||||
var b1Record, b2Record models.Book
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", b1.ID).First(&b1Record), "finding b1")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", b2.ID).First(&b2Record), "finding b2")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", b2.ID).First(&b2Record), "finding b2")
|
||||
|
|
@ -128,17 +128,17 @@ func TestGetBooksByName(t *testing.T) {
|
|||
anotherUser := testutils.SetupUserData()
|
||||
req := testutils.MakeReq(server.URL, "GET", "/v3/books?name=js", "")
|
||||
|
||||
b1 := database.Book{
|
||||
b1 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: "js",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), "preparing b1")
|
||||
b2 := database.Book{
|
||||
b2 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: "css",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b2), "preparing b2")
|
||||
b3 := database.Book{
|
||||
b3 := models.Book{
|
||||
UserID: anotherUser.ID,
|
||||
Label: "js",
|
||||
}
|
||||
|
|
@ -155,7 +155,7 @@ func TestGetBooksByName(t *testing.T) {
|
|||
t.Fatal(errors.Wrap(err, "decoding payload"))
|
||||
}
|
||||
|
||||
var b1Record database.Book
|
||||
var b1Record models.Book
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", b1.ID).First(&b1Record), "finding b1")
|
||||
|
||||
expected := []presenters.Book{
|
||||
|
|
@ -215,20 +215,20 @@ func TestDeleteBook(t *testing.T) {
|
|||
anotherUser := testutils.SetupUserData()
|
||||
testutils.MustExec(t, testutils.DB.Model(&anotherUser).Update("max_usn", 109), "preparing another user max_usn")
|
||||
|
||||
b1 := database.Book{
|
||||
b1 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: "js",
|
||||
USN: 1,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), "preparing a book data")
|
||||
b2 := database.Book{
|
||||
b2 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: tc.label,
|
||||
USN: 2,
|
||||
Deleted: tc.deleted,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b2), "preparing a book data")
|
||||
b3 := database.Book{
|
||||
b3 := models.Book{
|
||||
UserID: anotherUser.ID,
|
||||
Label: "linux",
|
||||
USN: 3,
|
||||
|
|
@ -244,14 +244,14 @@ func TestDeleteBook(t *testing.T) {
|
|||
n3Body = "n3 content"
|
||||
}
|
||||
|
||||
n1 := database.Note{
|
||||
n1 := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b1.UUID,
|
||||
Body: "n1 content",
|
||||
USN: 4,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&n1), "preparing a note data")
|
||||
n2 := database.Note{
|
||||
n2 := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b2.UUID,
|
||||
Body: n2Body,
|
||||
|
|
@ -259,7 +259,7 @@ func TestDeleteBook(t *testing.T) {
|
|||
Deleted: tc.deleted,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&n2), "preparing a note data")
|
||||
n3 := database.Note{
|
||||
n3 := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b2.UUID,
|
||||
Body: n3Body,
|
||||
|
|
@ -267,7 +267,7 @@ func TestDeleteBook(t *testing.T) {
|
|||
Deleted: tc.deleted,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&n3), "preparing a note data")
|
||||
n4 := database.Note{
|
||||
n4 := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b2.UUID,
|
||||
Body: "",
|
||||
|
|
@ -275,7 +275,7 @@ func TestDeleteBook(t *testing.T) {
|
|||
Deleted: true,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&n4), "preparing a note data")
|
||||
n5 := database.Note{
|
||||
n5 := models.Note{
|
||||
UserID: anotherUser.ID,
|
||||
BookUUID: b3.UUID,
|
||||
Body: "n5 content",
|
||||
|
|
@ -294,13 +294,13 @@ func TestDeleteBook(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusOK, "")
|
||||
|
||||
var b1Record, b2Record, b3Record database.Book
|
||||
var n1Record, n2Record, n3Record, n4Record, n5Record database.Note
|
||||
var userRecord database.User
|
||||
var b1Record, b2Record, b3Record models.Book
|
||||
var n1Record, n2Record, n3Record, n4Record, n5Record models.Note
|
||||
var userRecord models.User
|
||||
var bookCount, noteCount int
|
||||
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Book{}).Count(&bookCount), "counting books")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Note{}).Count(¬eCount), "counting notes")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Book{}).Count(&bookCount), "counting books")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Note{}).Count(¬eCount), "counting notes")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", b1.ID).First(&b1Record), "finding b1")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", b2.ID).First(&b2Record), "finding b2")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", b3.ID).First(&b3Record), "finding b3")
|
||||
|
|
@ -374,11 +374,11 @@ func TestCreateBook(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusCreated, "")
|
||||
|
||||
var bookRecord database.Book
|
||||
var userRecord database.User
|
||||
var bookRecord models.Book
|
||||
var userRecord models.User
|
||||
var bookCount, noteCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Book{}).Count(&bookCount), "counting books")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Note{}).Count(¬eCount), "counting notes")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Book{}).Count(&bookCount), "counting books")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Note{}).Count(¬eCount), "counting notes")
|
||||
testutils.MustExec(t, testutils.DB.First(&bookRecord), "finding book")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", user.ID).First(&userRecord), "finding user record")
|
||||
|
||||
|
|
@ -424,7 +424,7 @@ func TestCreateBookDuplicate(t *testing.T) {
|
|||
user := testutils.SetupUserData()
|
||||
testutils.MustExec(t, testutils.DB.Model(&user).Update("max_usn", 101), "preparing user max_usn")
|
||||
|
||||
b1 := database.Book{
|
||||
b1 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: "js",
|
||||
USN: 58,
|
||||
|
|
@ -438,11 +438,11 @@ func TestCreateBookDuplicate(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusConflict, "")
|
||||
|
||||
var bookRecord database.Book
|
||||
var bookRecord models.Book
|
||||
var bookCount, noteCount int
|
||||
var userRecord database.User
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Book{}).Count(&bookCount), "counting books")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Note{}).Count(¬eCount), "counting notes")
|
||||
var userRecord models.User
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Book{}).Count(&bookCount), "counting books")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Note{}).Count(¬eCount), "counting notes")
|
||||
testutils.MustExec(t, testutils.DB.First(&bookRecord), "finding book")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", user.ID).First(&userRecord), "finding user record")
|
||||
|
||||
|
|
@ -504,14 +504,14 @@ func TestUpdateBook(t *testing.T) {
|
|||
user := testutils.SetupUserData()
|
||||
testutils.MustExec(t, testutils.DB.Model(&user).Update("max_usn", 101), "preparing user max_usn")
|
||||
|
||||
b1 := database.Book{
|
||||
b1 := models.Book{
|
||||
UUID: tc.bookUUID,
|
||||
UserID: user.ID,
|
||||
Label: tc.bookLabel,
|
||||
Deleted: tc.bookDeleted,
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), "preparing b1")
|
||||
b2 := database.Book{
|
||||
b2 := models.Book{
|
||||
UUID: b2UUID,
|
||||
UserID: user.ID,
|
||||
Label: "js",
|
||||
|
|
@ -526,11 +526,11 @@ func TestUpdateBook(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusOK, fmt.Sprintf("status code mismatch for test case %d", idx))
|
||||
|
||||
var bookRecord database.Book
|
||||
var userRecord database.User
|
||||
var bookRecord models.Book
|
||||
var userRecord models.User
|
||||
var noteCount, bookCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Book{}).Count(&bookCount), "counting books")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Note{}).Count(¬eCount), "counting notes")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Book{}).Count(&bookCount), "counting books")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Note{}).Count(¬eCount), "counting notes")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", b1.ID).First(&bookRecord), "finding book")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", user.ID).First(&userRecord), "finding user record")
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ import (
|
|||
"net/http"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/handlers"
|
||||
"github.com/dnote/dnote/pkg/server/helpers"
|
||||
"github.com/dnote/dnote/pkg/server/presenters"
|
||||
|
|
@ -52,7 +52,7 @@ func (a *API) UpdateNote(w http.ResponseWriter, r *http.Request) {
|
|||
vars := mux.Vars(r)
|
||||
noteUUID := vars["noteUUID"]
|
||||
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
handlers.DoError(w, "No authenticated user found", nil, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -70,7 +70,7 @@ func (a *API) UpdateNote(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
var note database.Note
|
||||
var note models.Note
|
||||
if err := a.App.DB.Where("uuid = ? AND user_id = ?", noteUUID, user.ID).First(¬e).Error; err != nil {
|
||||
handlers.DoError(w, "finding note", err, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -89,7 +89,7 @@ func (a *API) UpdateNote(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
var book database.Book
|
||||
var book models.Book
|
||||
if err := tx.Where("uuid = ? AND user_id = ?", note.BookUUID, user.ID).First(&book).Error; err != nil {
|
||||
tx.Rollback()
|
||||
handlers.DoError(w, fmt.Sprintf("finding book %s to preload", note.BookUUID), err, http.StatusInternalServerError)
|
||||
|
|
@ -119,13 +119,13 @@ func (a *API) DeleteNote(w http.ResponseWriter, r *http.Request) {
|
|||
vars := mux.Vars(r)
|
||||
noteUUID := vars["noteUUID"]
|
||||
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
handlers.DoError(w, "No authenticated user found", nil, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
var note database.Note
|
||||
var note models.Note
|
||||
if err := a.App.DB.Where("uuid = ? AND user_id = ?", noteUUID, user.ID).Preload("Book").First(¬e).Error; err != nil {
|
||||
handlers.DoError(w, "finding note", err, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -171,7 +171,7 @@ type CreateNoteResp struct {
|
|||
|
||||
// CreateNote creates a note
|
||||
func (a *API) CreateNote(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
handlers.DoError(w, "No authenticated user found", nil, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -190,7 +190,7 @@ func (a *API) CreateNote(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
var book database.Book
|
||||
var book models.Book
|
||||
if err := a.App.DB.Where("uuid = ? AND user_id = ?", params.BookUUID, user.ID).First(&book).Error; err != nil {
|
||||
handlers.DoError(w, "finding book", err, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ import (
|
|||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/clock"
|
||||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
)
|
||||
|
||||
|
|
@ -44,7 +44,7 @@ func TestCreateNote(t *testing.T) {
|
|||
user := testutils.SetupUserData()
|
||||
testutils.MustExec(t, testutils.DB.Model(&user).Update("max_usn", 101), "preparing user max_usn")
|
||||
|
||||
b1 := database.Book{
|
||||
b1 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: "js",
|
||||
USN: 58,
|
||||
|
|
@ -59,12 +59,12 @@ func TestCreateNote(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusCreated, "")
|
||||
|
||||
var noteRecord database.Note
|
||||
var bookRecord database.Book
|
||||
var userRecord database.User
|
||||
var noteRecord models.Note
|
||||
var bookRecord models.Book
|
||||
var userRecord models.User
|
||||
var bookCount, noteCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Book{}).Count(&bookCount), "counting books")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Note{}).Count(¬eCount), "counting notes")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Book{}).Count(&bookCount), "counting books")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Note{}).Count(¬eCount), "counting notes")
|
||||
testutils.MustExec(t, testutils.DB.First(¬eRecord), "finding note")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", b1.ID).First(&bookRecord), "finding book")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", user.ID).First(&userRecord), "finding user record")
|
||||
|
|
@ -249,20 +249,20 @@ func TestUpdateNote(t *testing.T) {
|
|||
user := testutils.SetupUserData()
|
||||
testutils.MustExec(t, testutils.DB.Model(&user).Update("max_usn", 101), "preparing user max_usn")
|
||||
|
||||
b1 := database.Book{
|
||||
b1 := models.Book{
|
||||
UUID: b1UUID,
|
||||
UserID: user.ID,
|
||||
Label: "css",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), "preparing b1")
|
||||
b2 := database.Book{
|
||||
b2 := models.Book{
|
||||
UUID: b2UUID,
|
||||
UserID: user.ID,
|
||||
Label: "js",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b2), "preparing b2")
|
||||
|
||||
note := database.Note{
|
||||
note := models.Note{
|
||||
UserID: user.ID,
|
||||
UUID: tc.noteUUID,
|
||||
BookUUID: tc.noteBookUUID,
|
||||
|
|
@ -280,12 +280,12 @@ func TestUpdateNote(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusOK, "status code mismatch for test case")
|
||||
|
||||
var bookRecord database.Book
|
||||
var noteRecord database.Note
|
||||
var userRecord database.User
|
||||
var bookRecord models.Book
|
||||
var noteRecord models.Note
|
||||
var userRecord models.User
|
||||
var noteCount, bookCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Book{}).Count(&bookCount), "counting books")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Note{}).Count(¬eCount), "counting notes")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Book{}).Count(&bookCount), "counting books")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Note{}).Count(¬eCount), "counting notes")
|
||||
testutils.MustExec(t, testutils.DB.Where("uuid = ?", note.UUID).First(¬eRecord), "finding note")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", b1.ID).First(&bookRecord), "finding book")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", user.ID).First(&userRecord), "finding user record")
|
||||
|
|
@ -345,13 +345,13 @@ func TestDeleteNote(t *testing.T) {
|
|||
user := testutils.SetupUserData()
|
||||
testutils.MustExec(t, testutils.DB.Model(&user).Update("max_usn", 981), "preparing user max_usn")
|
||||
|
||||
b1 := database.Book{
|
||||
b1 := models.Book{
|
||||
UUID: b1UUID,
|
||||
UserID: user.ID,
|
||||
Label: "js",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), "preparing b1")
|
||||
note := database.Note{
|
||||
note := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b1.UUID,
|
||||
Body: tc.content,
|
||||
|
|
@ -368,12 +368,12 @@ func TestDeleteNote(t *testing.T) {
|
|||
// Test
|
||||
assert.StatusCodeEquals(t, res, http.StatusOK, "")
|
||||
|
||||
var bookRecord database.Book
|
||||
var noteRecord database.Note
|
||||
var userRecord database.User
|
||||
var bookRecord models.Book
|
||||
var noteRecord models.Note
|
||||
var userRecord models.User
|
||||
var bookCount, noteCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Book{}).Count(&bookCount), "counting books")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Note{}).Count(¬eCount), "counting notes")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Book{}).Count(&bookCount), "counting books")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Note{}).Count(¬eCount), "counting notes")
|
||||
testutils.MustExec(t, testutils.DB.Where("uuid = ?", note.UUID).First(¬eRecord), "finding note")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", b1.ID).First(&bookRecord), "finding book")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", user.ID).First(&userRecord), "finding user record")
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ import (
|
|||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/handlers"
|
||||
"github.com/dnote/dnote/pkg/server/helpers"
|
||||
"github.com/dnote/dnote/pkg/server/log"
|
||||
|
|
@ -66,7 +66,7 @@ type SyncFragNote struct {
|
|||
}
|
||||
|
||||
// NewFragNote presents the given note as a SyncFragNote
|
||||
func NewFragNote(note database.Note) SyncFragNote {
|
||||
func NewFragNote(note models.Note) SyncFragNote {
|
||||
return SyncFragNote{
|
||||
UUID: note.UUID,
|
||||
USN: note.USN,
|
||||
|
|
@ -94,7 +94,7 @@ type SyncFragBook struct {
|
|||
}
|
||||
|
||||
// NewFragBook presents the given book as a SyncFragBook
|
||||
func NewFragBook(book database.Book) SyncFragBook {
|
||||
func NewFragBook(book models.Book) SyncFragBook {
|
||||
return SyncFragBook{
|
||||
UUID: book.UUID,
|
||||
USN: book.USN,
|
||||
|
|
@ -122,11 +122,11 @@ func (e *queryParamError) Error() string {
|
|||
}
|
||||
|
||||
func (a *API) newFragment(userID, userMaxUSN, afterUSN, limit int) (SyncFragment, error) {
|
||||
var notes []database.Note
|
||||
var notes []models.Note
|
||||
if err := a.App.DB.Where("user_id = ? AND usn > ? AND usn <= ?", userID, afterUSN, userMaxUSN).Order("usn ASC").Limit(limit).Find(¬es).Error; err != nil {
|
||||
return SyncFragment{}, nil
|
||||
}
|
||||
var books []database.Book
|
||||
var books []models.Book
|
||||
if err := a.App.DB.Where("user_id = ? AND usn > ? AND usn <= ?", userID, afterUSN, userMaxUSN).Order("usn ASC").Limit(limit).Find(&books).Error; err != nil {
|
||||
return SyncFragment{}, nil
|
||||
}
|
||||
|
|
@ -168,16 +168,16 @@ func (a *API) newFragment(userID, userMaxUSN, afterUSN, limit int) (SyncFragment
|
|||
fragMaxUSN = item.usn
|
||||
|
||||
switch v := item.val.(type) {
|
||||
case database.Note:
|
||||
note := item.val.(database.Note)
|
||||
case models.Note:
|
||||
note := item.val.(models.Note)
|
||||
|
||||
if note.Deleted {
|
||||
fragExpungedNotes = append(fragExpungedNotes, note.UUID)
|
||||
} else {
|
||||
fragNotes = append(fragNotes, NewFragNote(note))
|
||||
}
|
||||
case database.Book:
|
||||
book := item.val.(database.Book)
|
||||
case models.Book:
|
||||
book := item.val.(models.Book)
|
||||
|
||||
if book.Deleted {
|
||||
fragExpungedBooks = append(fragExpungedBooks, book.UUID)
|
||||
|
|
@ -249,7 +249,7 @@ type GetSyncFragmentResp struct {
|
|||
|
||||
// GetSyncFragment responds with a sync fragment
|
||||
func (a *API) GetSyncFragment(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
handlers.DoError(w, "No authenticated user found", nil, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
@ -282,7 +282,7 @@ type GetSyncStateResp struct {
|
|||
|
||||
// GetSyncState responds with a sync fragment
|
||||
func (a *API) GetSyncState(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(database.User)
|
||||
user, ok := r.Context().Value(helpers.KeyUser).(models.User)
|
||||
if !ok {
|
||||
handlers.DoError(w, "No authenticated user found", nil, http.StatusInternalServerError)
|
||||
return
|
||||
|
|
|
|||
|
|
@ -19,28 +19,28 @@
|
|||
package app
|
||||
|
||||
import (
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/helpers"
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// CreateBook creates a book with the next usn and updates the user's max_usn
|
||||
func (a *App) CreateBook(user database.User, name string) (database.Book, error) {
|
||||
func (a *App) CreateBook(user models.User, name string) (models.Book, error) {
|
||||
tx := a.DB.Begin()
|
||||
|
||||
nextUSN, err := incrementUserUSN(tx, user.ID)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return database.Book{}, errors.Wrap(err, "incrementing user max_usn")
|
||||
return models.Book{}, errors.Wrap(err, "incrementing user max_usn")
|
||||
}
|
||||
|
||||
uuid, err := helpers.GenUUID()
|
||||
if err != nil {
|
||||
return database.Book{}, err
|
||||
return models.Book{}, err
|
||||
}
|
||||
|
||||
book := database.Book{
|
||||
book := models.Book{
|
||||
UUID: uuid,
|
||||
UserID: user.ID,
|
||||
Label: name,
|
||||
|
|
@ -59,7 +59,7 @@ func (a *App) CreateBook(user database.User, name string) (database.Book, error)
|
|||
}
|
||||
|
||||
// DeleteBook marks a book deleted with the next usn and updates the user's max_usn
|
||||
func (a *App) DeleteBook(tx *gorm.DB, user database.User, book database.Book) (database.Book, error) {
|
||||
func (a *App) DeleteBook(tx *gorm.DB, user models.User, book models.Book) (models.Book, error) {
|
||||
if user.ID != book.UserID {
|
||||
return book, errors.New("Not allowed")
|
||||
}
|
||||
|
|
@ -82,7 +82,7 @@ func (a *App) DeleteBook(tx *gorm.DB, user database.User, book database.Book) (d
|
|||
}
|
||||
|
||||
// UpdateBook updaates the book, the usn and the user's max_usn
|
||||
func (a *App) UpdateBook(tx *gorm.DB, user database.User, book database.Book, label *string) (database.Book, error) {
|
||||
func (a *App) UpdateBook(tx *gorm.DB, user models.User, book models.Book, label *string) (models.Book, error) {
|
||||
if user.ID != book.UserID {
|
||||
return book, errors.New("Not allowed")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ import (
|
|||
|
||||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/clock"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
|
@ -72,10 +72,10 @@ func TestCreateBook(t *testing.T) {
|
|||
}
|
||||
|
||||
var bookCount int
|
||||
var bookRecord database.Book
|
||||
var userRecord database.User
|
||||
var bookRecord models.Book
|
||||
var userRecord models.User
|
||||
|
||||
if err := testutils.DB.Model(&database.Book{}).Count(&bookCount).Error; err != nil {
|
||||
if err := testutils.DB.Model(&models.Book{}).Count(&bookCount).Error; err != nil {
|
||||
t.Fatal(errors.Wrap(err, "counting books"))
|
||||
}
|
||||
if err := testutils.DB.First(&bookRecord).Error; err != nil {
|
||||
|
|
@ -128,7 +128,7 @@ func TestDeleteBook(t *testing.T) {
|
|||
anotherUser := testutils.SetupUserData()
|
||||
testutils.MustExec(t, testutils.DB.Model(&anotherUser).Update("max_usn", 55), fmt.Sprintf("preparing user max_usn for test case %d", idx))
|
||||
|
||||
book := database.Book{UserID: user.ID, Label: "js", Deleted: false}
|
||||
book := models.Book{UserID: user.ID, Label: "js", Deleted: false}
|
||||
testutils.MustExec(t, testutils.DB.Save(&book), fmt.Sprintf("preparing book for test case %d", idx))
|
||||
|
||||
tx := testutils.DB.Begin()
|
||||
|
|
@ -141,10 +141,10 @@ func TestDeleteBook(t *testing.T) {
|
|||
tx.Commit()
|
||||
|
||||
var bookCount int
|
||||
var bookRecord database.Book
|
||||
var userRecord database.User
|
||||
var bookRecord models.Book
|
||||
var userRecord models.User
|
||||
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Book{}).Count(&bookCount), fmt.Sprintf("counting books for test case %d", idx))
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Book{}).Count(&bookCount), fmt.Sprintf("counting books for test case %d", idx))
|
||||
testutils.MustExec(t, testutils.DB.First(&bookRecord), fmt.Sprintf("finding book for test case %d", idx))
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", user.ID).First(&userRecord), fmt.Sprintf("finding user for test case %d", idx))
|
||||
|
||||
|
|
@ -206,7 +206,7 @@ func TestUpdateBook(t *testing.T) {
|
|||
anotherUser := testutils.SetupUserData()
|
||||
testutils.MustExec(t, testutils.DB.Model(&anotherUser).Update("max_usn", 55), fmt.Sprintf("preparing user max_usn for test case %d", idx))
|
||||
|
||||
b := database.Book{UserID: user.ID, Deleted: false, Label: tc.expectedLabel}
|
||||
b := models.Book{UserID: user.ID, Deleted: false, Label: tc.expectedLabel}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b), fmt.Sprintf("preparing book for test case %d", idx))
|
||||
|
||||
c := clock.NewMock()
|
||||
|
|
@ -224,9 +224,9 @@ func TestUpdateBook(t *testing.T) {
|
|||
tx.Commit()
|
||||
|
||||
var bookCount int
|
||||
var bookRecord database.Book
|
||||
var userRecord database.User
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Book{}).Count(&bookCount), fmt.Sprintf("counting books for test case %d", idx))
|
||||
var bookRecord models.Book
|
||||
var userRecord models.User
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Book{}).Count(&bookCount), fmt.Sprintf("counting books for test case %d", idx))
|
||||
testutils.MustExec(t, testutils.DB.First(&bookRecord), fmt.Sprintf("finding book for test case %d", idx))
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", user.ID).First(&userRecord), fmt.Sprintf("finding user for test case %d", idx))
|
||||
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
package app
|
||||
|
||||
import (
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
|
@ -31,7 +31,7 @@ func incrementUserUSN(tx *gorm.DB, userID int) (int, error) {
|
|||
return 0, errors.Wrap(err, "incrementing user max_usn")
|
||||
}
|
||||
|
||||
var user database.User
|
||||
var user models.User
|
||||
if err := tx.Select("max_usn").Where("id = ?", userID).First(&user).Error; err != nil {
|
||||
return 0, errors.Wrap(err, "getting the updated user max_usn")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
|
@ -60,7 +60,7 @@ func TestIncremenetUserUSN(t *testing.T) {
|
|||
tx.Commit()
|
||||
|
||||
// test
|
||||
var userRecord database.User
|
||||
var userRecord models.User
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", user.ID).First(&userRecord), fmt.Sprintf("finding user for test case %d", idx))
|
||||
|
||||
assert.Equal(t, userRecord.MaxUSN, tc.expectedMaxUSN, fmt.Sprintf("user max_usn mismatch for case %d", idx))
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
package app
|
||||
|
||||
import (
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/helpers"
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/pkg/errors"
|
||||
|
|
@ -27,13 +27,13 @@ import (
|
|||
|
||||
// CreateNote creates a note with the next usn and updates the user's max_usn.
|
||||
// It returns the created note.
|
||||
func (a *App) CreateNote(user database.User, bookUUID, content string, addedOn *int64, editedOn *int64, public bool, client string) (database.Note, error) {
|
||||
func (a *App) CreateNote(user models.User, bookUUID, content string, addedOn *int64, editedOn *int64, public bool, client string) (models.Note, error) {
|
||||
tx := a.DB.Begin()
|
||||
|
||||
nextUSN, err := incrementUserUSN(tx, user.ID)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return database.Note{}, errors.Wrap(err, "incrementing user max_usn")
|
||||
return models.Note{}, errors.Wrap(err, "incrementing user max_usn")
|
||||
}
|
||||
|
||||
var noteAddedOn int64
|
||||
|
|
@ -52,10 +52,10 @@ func (a *App) CreateNote(user database.User, bookUUID, content string, addedOn *
|
|||
|
||||
uuid, err := helpers.GenUUID()
|
||||
if err != nil {
|
||||
return database.Note{}, err
|
||||
return models.Note{}, err
|
||||
}
|
||||
|
||||
note := database.Note{
|
||||
note := models.Note{
|
||||
UUID: uuid,
|
||||
BookUUID: bookUUID,
|
||||
UserID: user.ID,
|
||||
|
|
@ -112,7 +112,7 @@ func (r UpdateNoteParams) GetPublic() bool {
|
|||
}
|
||||
|
||||
// UpdateNote creates a note with the next usn and updates the user's max_usn
|
||||
func (a *App) UpdateNote(tx *gorm.DB, user database.User, note database.Note, p *UpdateNoteParams) (database.Note, error) {
|
||||
func (a *App) UpdateNote(tx *gorm.DB, user models.User, note models.Note, p *UpdateNoteParams) (models.Note, error) {
|
||||
nextUSN, err := incrementUserUSN(tx, user.ID)
|
||||
if err != nil {
|
||||
return note, errors.Wrap(err, "incrementing user max_usn")
|
||||
|
|
@ -142,7 +142,7 @@ func (a *App) UpdateNote(tx *gorm.DB, user database.User, note database.Note, p
|
|||
}
|
||||
|
||||
// DeleteNote marks a note deleted with the next usn and updates the user's max_usn
|
||||
func (a *App) DeleteNote(tx *gorm.DB, user database.User, note database.Note) (database.Note, error) {
|
||||
func (a *App) DeleteNote(tx *gorm.DB, user models.User, note models.Note) (models.Note, error) {
|
||||
nextUSN, err := incrementUserUSN(tx, user.ID)
|
||||
if err != nil {
|
||||
return note, errors.Wrap(err, "incrementing user max_usn")
|
||||
|
|
@ -161,8 +161,8 @@ func (a *App) DeleteNote(tx *gorm.DB, user database.User, note database.Note) (d
|
|||
}
|
||||
|
||||
// GetUserNoteByUUID retrives a digest by the uuid for the given user
|
||||
func (a *App) GetUserNoteByUUID(userID int, uuid string) (*database.Note, error) {
|
||||
var ret database.Note
|
||||
func (a *App) GetUserNoteByUUID(userID int, uuid string) (*models.Note, error) {
|
||||
var ret models.Note
|
||||
conn := a.DB.Where("user_id = ? AND uuid = ?", userID, uuid).First(&ret)
|
||||
|
||||
if conn.RecordNotFound() {
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ import (
|
|||
|
||||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/clock"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
|
@ -82,7 +82,7 @@ func TestCreateNote(t *testing.T) {
|
|||
anotherUser := testutils.SetupUserData()
|
||||
testutils.MustExec(t, testutils.DB.Model(&anotherUser).Update("max_usn", 55), fmt.Sprintf("preparing user max_usn for test case %d", idx))
|
||||
|
||||
b1 := database.Book{UserID: user.ID, Label: "js", Deleted: false}
|
||||
b1 := models.Book{UserID: user.ID, Label: "js", Deleted: false}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), fmt.Sprintf("preparing b1 for test case %d", idx))
|
||||
|
||||
a := NewTest(&App{
|
||||
|
|
@ -97,11 +97,11 @@ func TestCreateNote(t *testing.T) {
|
|||
tx.Commit()
|
||||
|
||||
var bookCount, noteCount int
|
||||
var noteRecord database.Note
|
||||
var userRecord database.User
|
||||
var noteRecord models.Note
|
||||
var userRecord models.User
|
||||
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Book{}).Count(&bookCount), fmt.Sprintf("counting book for test case %d", idx))
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Note{}).Count(¬eCount), fmt.Sprintf("counting notes for test case %d", idx))
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Book{}).Count(&bookCount), fmt.Sprintf("counting book for test case %d", idx))
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Note{}).Count(¬eCount), fmt.Sprintf("counting notes for test case %d", idx))
|
||||
testutils.MustExec(t, testutils.DB.First(¬eRecord), fmt.Sprintf("finding note for test case %d", idx))
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", user.ID).First(&userRecord), fmt.Sprintf("finding user for test case %d", idx))
|
||||
|
||||
|
|
@ -145,10 +145,10 @@ func TestUpdateNote(t *testing.T) {
|
|||
anotherUser := testutils.SetupUserData()
|
||||
testutils.MustExec(t, testutils.DB.Model(&anotherUser).Update("max_usn", 55), "preparing user max_usn for test case")
|
||||
|
||||
b1 := database.Book{UserID: user.ID, Label: "js", Deleted: false}
|
||||
b1 := models.Book{UserID: user.ID, Label: "js", Deleted: false}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), "preparing b1 for test case")
|
||||
|
||||
note := database.Note{UserID: user.ID, Deleted: false, Body: "test content", BookUUID: b1.UUID}
|
||||
note := models.Note{UserID: user.ID, Deleted: false, Body: "test content", BookUUID: b1.UUID}
|
||||
testutils.MustExec(t, testutils.DB.Save(¬e), "preparing note for test case")
|
||||
|
||||
c := clock.NewMock()
|
||||
|
|
@ -170,11 +170,11 @@ func TestUpdateNote(t *testing.T) {
|
|||
tx.Commit()
|
||||
|
||||
var bookCount, noteCount int
|
||||
var noteRecord database.Note
|
||||
var userRecord database.User
|
||||
var noteRecord models.Note
|
||||
var userRecord models.User
|
||||
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Book{}).Count(&bookCount), "counting book for test case")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Note{}).Count(¬eCount), "counting notes for test case")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Book{}).Count(&bookCount), "counting book for test case")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Note{}).Count(¬eCount), "counting notes for test case")
|
||||
testutils.MustExec(t, testutils.DB.First(¬eRecord), "finding note for test case")
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", user.ID).First(&userRecord), "finding user for test case")
|
||||
|
||||
|
|
@ -220,10 +220,10 @@ func TestDeleteNote(t *testing.T) {
|
|||
anotherUser := testutils.SetupUserData()
|
||||
testutils.MustExec(t, testutils.DB.Model(&anotherUser).Update("max_usn", 55), fmt.Sprintf("preparing user max_usn for test case %d", idx))
|
||||
|
||||
b1 := database.Book{UserID: user.ID, Label: "testBook"}
|
||||
b1 := models.Book{UserID: user.ID, Label: "testBook"}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), fmt.Sprintf("preparing b1 for test case %d", idx))
|
||||
|
||||
note := database.Note{UserID: user.ID, Deleted: false, Body: "test content", BookUUID: b1.UUID}
|
||||
note := models.Note{UserID: user.ID, Deleted: false, Body: "test content", BookUUID: b1.UUID}
|
||||
testutils.MustExec(t, testutils.DB.Save(¬e), fmt.Sprintf("preparing note for test case %d", idx))
|
||||
|
||||
a := NewTest(nil)
|
||||
|
|
@ -237,10 +237,10 @@ func TestDeleteNote(t *testing.T) {
|
|||
tx.Commit()
|
||||
|
||||
var noteCount int
|
||||
var noteRecord database.Note
|
||||
var userRecord database.User
|
||||
var noteRecord models.Note
|
||||
var userRecord models.User
|
||||
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Note{}).Count(¬eCount), fmt.Sprintf("counting notes for test case %d", idx))
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Note{}).Count(¬eCount), fmt.Sprintf("counting notes for test case %d", idx))
|
||||
testutils.MustExec(t, testutils.DB.First(¬eRecord), fmt.Sprintf("finding note for test case %d", idx))
|
||||
testutils.MustExec(t, testutils.DB.Where("id = ?", user.ID).First(&userRecord), fmt.Sprintf("finding user for test case %d", idx))
|
||||
|
||||
|
|
|
|||
|
|
@ -22,19 +22,19 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/crypt"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// CreateSession returns a new session for the user of the given id
|
||||
func (a *App) CreateSession(userID int) (database.Session, error) {
|
||||
func (a *App) CreateSession(userID int) (models.Session, error) {
|
||||
key, err := crypt.GetRandomStr(32)
|
||||
if err != nil {
|
||||
return database.Session{}, errors.Wrap(err, "generating key")
|
||||
return models.Session{}, errors.Wrap(err, "generating key")
|
||||
}
|
||||
|
||||
session := database.Session{
|
||||
session := models.Session{
|
||||
UserID: userID,
|
||||
Key: key,
|
||||
LastUsedAt: time.Now(),
|
||||
|
|
@ -42,7 +42,7 @@ func (a *App) CreateSession(userID int) (database.Session, error) {
|
|||
}
|
||||
|
||||
if err := a.DB.Save(&session).Error; err != nil {
|
||||
return database.Session{}, errors.Wrap(err, "saving session")
|
||||
return models.Session{}, errors.Wrap(err, "saving session")
|
||||
}
|
||||
|
||||
return session, nil
|
||||
|
|
@ -51,7 +51,7 @@ func (a *App) CreateSession(userID int) (database.Session, error) {
|
|||
// DeleteUserSessions deletes all existing sessions for the given user. It effectively
|
||||
// invalidates all existing sessions.
|
||||
func (a *App) DeleteUserSessions(db *gorm.DB, userID int) error {
|
||||
if err := db.Debug().Where("user_id = ?", userID).Delete(&database.Session{}).Error; err != nil {
|
||||
if err := db.Debug().Where("user_id = ?", userID).Delete(&models.Session{}).Error; err != nil {
|
||||
return errors.Wrap(err, "deleting sessions")
|
||||
}
|
||||
|
||||
|
|
@ -60,7 +60,7 @@ func (a *App) DeleteUserSessions(db *gorm.DB, userID int) error {
|
|||
|
||||
// DeleteSession deletes the session that match the given info
|
||||
func (a *App) DeleteSession(sessionKey string) error {
|
||||
if err := a.DB.Where("key = ?", sessionKey).Delete(&database.Session{}).Error; err != nil {
|
||||
if err := a.DB.Where("key = ?", sessionKey).Delete(&models.Session{}).Error; err != nil {
|
||||
return errors.Wrap(err, "deleting the session")
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
package app
|
||||
|
||||
import (
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/log"
|
||||
"github.com/dnote/dnote/pkg/server/token"
|
||||
"github.com/jinzhu/gorm"
|
||||
|
|
@ -28,17 +28,17 @@ import (
|
|||
)
|
||||
|
||||
// TouchLastLoginAt updates the last login timestamp
|
||||
func (a *App) TouchLastLoginAt(user database.User, tx *gorm.DB) error {
|
||||
func (a *App) TouchLastLoginAt(user models.User, tx *gorm.DB) error {
|
||||
t := a.Clock.Now()
|
||||
if err := tx.Model(&user).Update(database.User{LastLoginAt: &t}).Error; err != nil {
|
||||
if err := tx.Model(&user).Update(models.User{LastLoginAt: &t}).Error; err != nil {
|
||||
return errors.Wrap(err, "updating last_login_at")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func createEmailPreference(user database.User, tx *gorm.DB) error {
|
||||
p := database.EmailPreference{
|
||||
func createEmailPreference(user models.User, tx *gorm.DB) error {
|
||||
p := models.EmailPreference{
|
||||
UserID: user.ID,
|
||||
}
|
||||
if err := tx.Save(&p).Error; err != nil {
|
||||
|
|
@ -49,21 +49,21 @@ func createEmailPreference(user database.User, tx *gorm.DB) error {
|
|||
}
|
||||
|
||||
// CreateUser creates a user
|
||||
func (a *App) CreateUser(email, password string) (database.User, error) {
|
||||
func (a *App) CreateUser(email, password string) (models.User, error) {
|
||||
tx := a.DB.Begin()
|
||||
|
||||
var count int
|
||||
if err := tx.Model(database.Account{}).Where("email = ?", email).Count(&count).Error; err != nil {
|
||||
return database.User{}, errors.Wrap(err, "counting user")
|
||||
if err := tx.Model(models.Account{}).Where("email = ?", email).Count(&count).Error; err != nil {
|
||||
return models.User{}, errors.Wrap(err, "counting user")
|
||||
}
|
||||
if count > 0 {
|
||||
return database.User{}, ErrDuplicateEmail
|
||||
return models.User{}, ErrDuplicateEmail
|
||||
}
|
||||
|
||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return database.User{}, errors.Wrap(err, "hashing password")
|
||||
return models.User{}, errors.Wrap(err, "hashing password")
|
||||
}
|
||||
|
||||
// Grant all privileges if self-hosting
|
||||
|
|
@ -74,34 +74,34 @@ func (a *App) CreateUser(email, password string) (database.User, error) {
|
|||
pro = false
|
||||
}
|
||||
|
||||
user := database.User{
|
||||
user := models.User{
|
||||
Cloud: pro,
|
||||
}
|
||||
if err = tx.Save(&user).Error; err != nil {
|
||||
tx.Rollback()
|
||||
return database.User{}, errors.Wrap(err, "saving user")
|
||||
return models.User{}, errors.Wrap(err, "saving user")
|
||||
}
|
||||
account := database.Account{
|
||||
Email: database.ToNullString(email),
|
||||
Password: database.ToNullString(string(hashedPassword)),
|
||||
account := models.Account{
|
||||
Email: models.ToNullString(email),
|
||||
Password: models.ToNullString(string(hashedPassword)),
|
||||
UserID: user.ID,
|
||||
}
|
||||
if err = tx.Save(&account).Error; err != nil {
|
||||
tx.Rollback()
|
||||
return database.User{}, errors.Wrap(err, "saving account")
|
||||
return models.User{}, errors.Wrap(err, "saving account")
|
||||
}
|
||||
|
||||
if _, err := token.Create(tx, user.ID, database.TokenTypeEmailPreference); err != nil {
|
||||
if _, err := token.Create(tx, user.ID, models.TokenTypeEmailPreference); err != nil {
|
||||
tx.Rollback()
|
||||
return database.User{}, errors.Wrap(err, "creating email verificaiton token")
|
||||
return models.User{}, errors.Wrap(err, "creating email verificaiton token")
|
||||
}
|
||||
if err := createEmailPreference(user, tx); err != nil {
|
||||
tx.Rollback()
|
||||
return database.User{}, errors.Wrap(err, "creating email preference")
|
||||
return models.User{}, errors.Wrap(err, "creating email preference")
|
||||
}
|
||||
if err := a.TouchLastLoginAt(user, tx); err != nil {
|
||||
tx.Rollback()
|
||||
return database.User{}, errors.Wrap(err, "updating last login")
|
||||
return models.User{}, errors.Wrap(err, "updating last login")
|
||||
}
|
||||
|
||||
tx.Commit()
|
||||
|
|
@ -110,8 +110,8 @@ func (a *App) CreateUser(email, password string) (database.User, error) {
|
|||
}
|
||||
|
||||
// Authenticate authenticates a user
|
||||
func (a *App) Authenticate(email, password string) (*database.User, error) {
|
||||
var account database.Account
|
||||
func (a *App) Authenticate(email, password string) (*models.User, error) {
|
||||
var account models.Account
|
||||
conn := a.DB.Where("email = ?", email).First(&account)
|
||||
if conn.RecordNotFound() {
|
||||
return nil, ErrNotFound
|
||||
|
|
@ -124,7 +124,7 @@ func (a *App) Authenticate(email, password string) (*database.User, error) {
|
|||
return nil, ErrLoginInvalid
|
||||
}
|
||||
|
||||
var user database.User
|
||||
var user models.User
|
||||
err = a.DB.Where("id = ?", account.UserID).First(&user).Error
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "finding user")
|
||||
|
|
@ -134,7 +134,7 @@ func (a *App) Authenticate(email, password string) (*database.User, error) {
|
|||
}
|
||||
|
||||
// SignIn signs in a user
|
||||
func (a *App) SignIn(user *database.User) (*database.Session, error) {
|
||||
func (a *App) SignIn(user *models.User) (*models.Session, error) {
|
||||
err := a.TouchLastLoginAt(*user, a.DB)
|
||||
if err != nil {
|
||||
log.ErrorWrap(err, "touching login timestamp")
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ import (
|
|||
|
||||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/server/config"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
"github.com/pkg/errors"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
|
|
@ -60,8 +60,8 @@ func TestCreateUser_ProValue(t *testing.T) {
|
|||
}
|
||||
|
||||
var userCount int
|
||||
var userRecord database.User
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.User{}).Count(&userCount), "counting user")
|
||||
var userRecord models.User
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.User{}).Count(&userCount), "counting user")
|
||||
testutils.MustExec(t, testutils.DB.First(&userRecord), "finding user")
|
||||
|
||||
assert.Equal(t, userCount, 1, "book count mismatch")
|
||||
|
|
@ -83,12 +83,12 @@ func TestCreateUser(t *testing.T) {
|
|||
}
|
||||
|
||||
var userCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.User{}).Count(&userCount), "counting user")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.User{}).Count(&userCount), "counting user")
|
||||
assert.Equal(t, userCount, 1, "book count mismatch")
|
||||
|
||||
var accountCount int
|
||||
var accountRecord database.Account
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Account{}).Count(&accountCount), "counting account")
|
||||
var accountRecord models.Account
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Account{}).Count(&accountCount), "counting account")
|
||||
testutils.MustExec(t, testutils.DB.First(&accountRecord), "finding account")
|
||||
|
||||
assert.Equal(t, accountCount, 1, "account count mismatch")
|
||||
|
|
@ -101,8 +101,8 @@ func TestCreateUser(t *testing.T) {
|
|||
t.Run("duplicate email", func(t *testing.T) {
|
||||
defer testutils.ClearData(testutils.DB)
|
||||
|
||||
aliceUser := database.User{}
|
||||
aliceAccount := database.Account{UserID: aliceUser.ID, Email: database.ToNullString("alice@example.com")}
|
||||
aliceUser := models.User{}
|
||||
aliceAccount := models.Account{UserID: aliceUser.ID, Email: models.ToNullString("alice@example.com")}
|
||||
testutils.MustExec(t, testutils.DB.Save(&aliceUser), "preparing a user")
|
||||
testutils.MustExec(t, testutils.DB.Save(&aliceAccount), "preparing an account")
|
||||
|
||||
|
|
@ -112,8 +112,8 @@ func TestCreateUser(t *testing.T) {
|
|||
assert.Equal(t, err, ErrDuplicateEmail, "error mismatch")
|
||||
|
||||
var userCount, accountCount int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.User{}).Count(&userCount), "counting user")
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Account{}).Count(&accountCount), "counting account")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.User{}).Count(&userCount), "counting user")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Account{}).Count(&accountCount), "counting account")
|
||||
|
||||
assert.Equal(t, userCount, 1, "user count mismatch")
|
||||
assert.Equal(t, accountCount, 1, "account count mismatch")
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ package context
|
|||
import (
|
||||
"context"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
)
|
||||
|
||||
const (
|
||||
|
|
@ -14,20 +14,20 @@ const (
|
|||
type privateKey string
|
||||
|
||||
// WithUser creates a new context with the given user
|
||||
func WithUser(ctx context.Context, user *database.User) context.Context {
|
||||
func WithUser(ctx context.Context, user *models.User) context.Context {
|
||||
return context.WithValue(ctx, userKey, user)
|
||||
}
|
||||
|
||||
// WithToken creates a new context with the given user
|
||||
func WithToken(ctx context.Context, tok *database.Token) context.Context {
|
||||
func WithToken(ctx context.Context, tok *models.Token) context.Context {
|
||||
return context.WithValue(ctx, tokenKey, tok)
|
||||
}
|
||||
|
||||
// User retrieves a user from the given context. It returns a pointer to
|
||||
// a user. If the context does not contain a user, it returns nil.
|
||||
func User(ctx context.Context) *database.User {
|
||||
func User(ctx context.Context) *models.User {
|
||||
if temp := ctx.Value(userKey); temp != nil {
|
||||
if user, ok := temp.(*database.User); ok {
|
||||
if user, ok := temp.(*models.User); ok {
|
||||
return user
|
||||
}
|
||||
}
|
||||
|
|
@ -36,9 +36,9 @@ func User(ctx context.Context) *database.User {
|
|||
}
|
||||
|
||||
// Token retrieves a token from the given context.
|
||||
func Token(ctx context.Context) *database.Token {
|
||||
func Token(ctx context.Context) *models.Token {
|
||||
if temp := ctx.Value(tokenKey); temp != nil {
|
||||
if tok, ok := temp.(*database.Token); ok {
|
||||
if tok, ok := temp.(*models.Token); ok {
|
||||
return tok
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/log"
|
||||
"github.com/dnote/dnote/pkg/server/views"
|
||||
"github.com/gorilla/schema"
|
||||
|
|
@ -233,7 +233,7 @@ func handleJSONError(w http.ResponseWriter, err error, msg string) {
|
|||
|
||||
// respondWithSession makes a HTTP response with the session from the user with the given userID.
|
||||
// It sets the HTTP-Only cookie for browser clients and also sends a JSON response for non-browser clients.
|
||||
func respondWithSession(w http.ResponseWriter, statusCode int, session *database.Session) {
|
||||
func respondWithSession(w http.ResponseWriter, statusCode int, session *models.Session) {
|
||||
setSessionCookie(w, session.Key, session.ExpiresAt)
|
||||
|
||||
response := SessionResponse{
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import (
|
|||
|
||||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/config"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/views"
|
||||
// "github.com/nadproject/nad/pkg/server/context"
|
||||
)
|
||||
|
|
@ -31,7 +31,7 @@ func (n *Notes) Index(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
var vd views.Data
|
||||
vd.Yield = struct {
|
||||
Notes []database.Note
|
||||
Notes []models.Note
|
||||
}{
|
||||
Notes: nil,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import (
|
|||
|
||||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/config"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/log"
|
||||
"github.com/dnote/dnote/pkg/server/views"
|
||||
"github.com/pkg/errors"
|
||||
|
|
@ -77,7 +77,7 @@ type LoginForm struct {
|
|||
Password string `schema:"password" json:"password"`
|
||||
}
|
||||
|
||||
func (u *Users) login(r *http.Request) (*database.Session, error) {
|
||||
func (u *Users) login(r *http.Request) (*models.Session, error) {
|
||||
var form LoginForm
|
||||
if err := parseRequestData(r, &form); err != nil {
|
||||
return nil, err
|
||||
|
|
|
|||
|
|
@ -7,16 +7,16 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/helpers"
|
||||
"github.com/dnote/dnote/pkg/server/log"
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
func authWithToken(db *gorm.DB, r *http.Request, tokenType string, p *AuthParams) (database.User, database.Token, bool, error) {
|
||||
var user database.User
|
||||
var token database.Token
|
||||
func authWithToken(db *gorm.DB, r *http.Request, tokenType string, p *AuthParams) (models.User, models.Token, bool, error) {
|
||||
var user models.User
|
||||
var token models.Token
|
||||
|
||||
query := r.URL.Query()
|
||||
tokenValue := query.Get("token")
|
||||
|
|
@ -132,8 +132,8 @@ func TokenAuth(a *app.App, next http.HandlerFunc, tokenType string, p *AuthParam
|
|||
}
|
||||
|
||||
// AuthWithSession performs user authentication with session
|
||||
func AuthWithSession(db *gorm.DB, r *http.Request, p *AuthParams) (database.User, bool, error) {
|
||||
var user database.User
|
||||
func AuthWithSession(db *gorm.DB, r *http.Request, p *AuthParams) (models.User, bool, error) {
|
||||
var user models.User
|
||||
|
||||
sessionKey, err := GetCredential(r)
|
||||
if err != nil {
|
||||
|
|
@ -143,7 +143,7 @@ func AuthWithSession(db *gorm.DB, r *http.Request, p *AuthParams) (database.User
|
|||
return user, false, nil
|
||||
}
|
||||
|
||||
var session database.Session
|
||||
var session models.Session
|
||||
conn := db.Where("key = ?", sessionKey).First(&session)
|
||||
|
||||
if conn.RecordNotFound() {
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ import (
|
|||
|
||||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
|
@ -184,13 +184,13 @@ func TestAuthMiddleware(t *testing.T) {
|
|||
defer testutils.ClearData(testutils.DB)
|
||||
|
||||
user := testutils.SetupUserData()
|
||||
session := database.Session{
|
||||
session := models.Session{
|
||||
Key: "A9xgggqzTHETy++GDi1NpDNe0iyqosPm9bitdeNGkJU=",
|
||||
UserID: user.ID,
|
||||
ExpiresAt: time.Now().Add(time.Hour * 24),
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&session), "preparing session")
|
||||
session2 := database.Session{
|
||||
session2 := models.Session{
|
||||
Key: "Vvgm3eBXfXGEFWERI7faiRJ3DAzJw+7DdT9J1LEyNfI=",
|
||||
UserID: user.ID,
|
||||
ExpiresAt: time.Now().Add(-time.Hour * 24),
|
||||
|
|
@ -298,7 +298,7 @@ func TestAuthMiddleware_ProOnly(t *testing.T) {
|
|||
|
||||
user := testutils.SetupUserData()
|
||||
testutils.MustExec(t, testutils.DB.Model(&user).Update("cloud", false), "preparing session")
|
||||
session := database.Session{
|
||||
session := models.Session{
|
||||
Key: "A9xgggqzTHETy++GDi1NpDNe0iyqosPm9bitdeNGkJU=",
|
||||
UserID: user.ID,
|
||||
ExpiresAt: time.Now().Add(time.Hour * 24),
|
||||
|
|
@ -413,7 +413,7 @@ func TestAuthMiddleware_RedirectGuestsToLogin(t *testing.T) {
|
|||
|
||||
user := testutils.SetupUserData()
|
||||
testutils.MustExec(t, testutils.DB.Model(&user).Update("cloud", false), "preparing session")
|
||||
session := database.Session{
|
||||
session := models.Session{
|
||||
Key: "A9xgggqzTHETy++GDi1NpDNe0iyqosPm9bitdeNGkJU=",
|
||||
UserID: user.ID,
|
||||
ExpiresAt: time.Now().Add(time.Hour * 24),
|
||||
|
|
@ -435,13 +435,13 @@ func TestTokenAuthMiddleWare(t *testing.T) {
|
|||
defer testutils.ClearData(testutils.DB)
|
||||
|
||||
user := testutils.SetupUserData()
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: user.ID,
|
||||
Type: database.TokenTypeEmailPreference,
|
||||
Type: models.TokenTypeEmailPreference,
|
||||
Value: "xpwFnc0MdllFUePDq9DLeQ==",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&tok), "preparing token")
|
||||
session := database.Session{
|
||||
session := models.Session{
|
||||
Key: "A9xgggqzTHETy++GDi1NpDNe0iyqosPm9bitdeNGkJU=",
|
||||
UserID: user.ID,
|
||||
ExpiresAt: time.Now().Add(time.Hour * 24),
|
||||
|
|
@ -453,7 +453,7 @@ func TestTokenAuthMiddleWare(t *testing.T) {
|
|||
}
|
||||
|
||||
a := &app.App{DB: testutils.DB}
|
||||
server := httptest.NewServer(TokenAuth(a, handler, database.TokenTypeEmailPreference, nil))
|
||||
server := httptest.NewServer(TokenAuth(a, handler, models.TokenTypeEmailPreference, nil))
|
||||
defer server.Close()
|
||||
|
||||
t.Run("with token", func(t *testing.T) {
|
||||
|
|
@ -566,13 +566,13 @@ func TestTokenAuthMiddleWare_ProOnly(t *testing.T) {
|
|||
|
||||
user := testutils.SetupUserData()
|
||||
testutils.MustExec(t, testutils.DB.Model(&user).Update("cloud", false), "preparing session")
|
||||
tok := database.Token{
|
||||
tok := models.Token{
|
||||
UserID: user.ID,
|
||||
Type: database.TokenTypeEmailPreference,
|
||||
Type: models.TokenTypeEmailPreference,
|
||||
Value: "xpwFnc0MdllFUePDq9DLeQ==",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&tok), "preparing token")
|
||||
session := database.Session{
|
||||
session := models.Session{
|
||||
Key: "A9xgggqzTHETy++GDi1NpDNe0iyqosPm9bitdeNGkJU=",
|
||||
UserID: user.ID,
|
||||
ExpiresAt: time.Now().Add(time.Hour * 24),
|
||||
|
|
@ -584,7 +584,7 @@ func TestTokenAuthMiddleWare_ProOnly(t *testing.T) {
|
|||
}
|
||||
|
||||
a := &app.App{DB: testutils.DB}
|
||||
server := httptest.NewServer(TokenAuth(a, handler, database.TokenTypeEmailPreference, &AuthParams{
|
||||
server := httptest.NewServer(TokenAuth(a, handler, models.TokenTypeEmailPreference, &AuthParams{
|
||||
ProOnly: true,
|
||||
}))
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ import (
|
|||
"github.com/dnote/dnote/pkg/clock"
|
||||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/config"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/log"
|
||||
"github.com/dnote/dnote/pkg/server/mailer"
|
||||
"github.com/jinzhu/gorm"
|
||||
|
|
@ -44,8 +44,8 @@ type inactiveUserInfo struct {
|
|||
sampleNoteUUID string
|
||||
}
|
||||
|
||||
func (c *Context) sampleUserNote(userID int) (database.Note, error) {
|
||||
var ret database.Note
|
||||
func (c *Context) sampleUserNote(userID int) (models.Note, error) {
|
||||
var ret models.Note
|
||||
// FIXME: ordering by random() requires a sequential scan on the whole table and does not scale
|
||||
if err := c.DB.Where("user_id = ?", userID).Order("random() DESC").First(&ret).Error; err != nil {
|
||||
return ret, errors.Wrap(err, "getting a random note")
|
||||
|
|
@ -103,7 +103,7 @@ GROUP BY notes.user_id, accounts.email`, threshold).Rows()
|
|||
}
|
||||
|
||||
func (c *Context) canNotify(info inactiveUserInfo) (bool, error) {
|
||||
var pref database.EmailPreference
|
||||
var pref models.EmailPreference
|
||||
if err := c.DB.Where("user_id = ?", info.userID).First(&pref).Error; err != nil {
|
||||
return false, errors.Wrap(err, "getting email preference")
|
||||
}
|
||||
|
|
@ -112,7 +112,7 @@ func (c *Context) canNotify(info inactiveUserInfo) (bool, error) {
|
|||
return false, nil
|
||||
}
|
||||
|
||||
var notif database.Notification
|
||||
var notif models.Notification
|
||||
conn := c.DB.Where("user_id = ? AND type = ?", info.userID, mailer.EmailTypeInactiveReminder).Order("created_at DESC").First(¬if)
|
||||
|
||||
if conn.RecordNotFound() {
|
||||
|
|
@ -143,7 +143,7 @@ func (c *Context) process(info inactiveUserInfo) error {
|
|||
return errors.Wrap(err, "getting sender email")
|
||||
}
|
||||
|
||||
tok, err := mailer.GetToken(c.DB, info.userID, database.TokenTypeEmailPreference)
|
||||
tok, err := mailer.GetToken(c.DB, info.userID, models.TokenTypeEmailPreference)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "getting email token")
|
||||
}
|
||||
|
|
@ -162,7 +162,7 @@ func (c *Context) process(info inactiveUserInfo) error {
|
|||
return errors.Wrap(err, "queueing email")
|
||||
}
|
||||
|
||||
if err := c.DB.Create(&database.Notification{
|
||||
if err := c.DB.Create(&models.Notification{
|
||||
Type: mailer.EmailTypeInactiveReminder,
|
||||
UserID: info.userID,
|
||||
}).Error; err != nil {
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ import (
|
|||
|
||||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/clock"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/mailer"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
"github.com/pkg/errors"
|
||||
|
|
@ -54,14 +54,14 @@ func TestDoInactive(t *testing.T) {
|
|||
u1 := testutils.SetupUserData()
|
||||
a1 := testutils.SetupAccountData(u1, "alice@example.com", "pass1234")
|
||||
testutils.MustExec(t, testutils.DB.Model(&a1).Update("email_verified", true), "setting email verified")
|
||||
testutils.MustExec(t, testutils.DB.Save(&database.EmailPreference{UserID: u1.ID, InactiveReminder: true}), "preparing email preference")
|
||||
testutils.MustExec(t, testutils.DB.Save(&models.EmailPreference{UserID: u1.ID, InactiveReminder: true}), "preparing email preference")
|
||||
|
||||
b1 := database.Book{
|
||||
b1 := models.Book{
|
||||
UserID: u1.ID,
|
||||
Label: "js",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), "preparing b1")
|
||||
n1 := database.Note{
|
||||
n1 := models.Note{
|
||||
BookUUID: b1.UUID,
|
||||
UserID: u1.ID,
|
||||
}
|
||||
|
|
@ -71,14 +71,14 @@ func TestDoInactive(t *testing.T) {
|
|||
u2 := testutils.SetupUserData()
|
||||
a2 := testutils.SetupAccountData(u2, "bob@example.com", "pass1234")
|
||||
testutils.MustExec(t, testutils.DB.Model(&a2).Update("email_verified", true), "setting email verified")
|
||||
testutils.MustExec(t, testutils.DB.Save(&database.EmailPreference{UserID: u2.ID, InactiveReminder: true}), "preparing email preference")
|
||||
testutils.MustExec(t, testutils.DB.Save(&models.EmailPreference{UserID: u2.ID, InactiveReminder: true}), "preparing email preference")
|
||||
|
||||
b2 := database.Book{
|
||||
b2 := models.Book{
|
||||
UserID: u2.ID,
|
||||
Label: "css",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b2), "preparing b2")
|
||||
n2 := database.Note{
|
||||
n2 := models.Note{
|
||||
UserID: u2.ID,
|
||||
BookUUID: b2.UUID,
|
||||
}
|
||||
|
|
@ -89,16 +89,16 @@ func TestDoInactive(t *testing.T) {
|
|||
u3 := testutils.SetupUserData()
|
||||
a3 := testutils.SetupAccountData(u3, "alice@example.com", "pass1234")
|
||||
testutils.MustExec(t, testutils.DB.Model(&a3).Update("email_verified", true), "setting email verified")
|
||||
emailPref3 := database.EmailPreference{UserID: u3.ID}
|
||||
emailPref3 := models.EmailPreference{UserID: u3.ID}
|
||||
testutils.MustExec(t, testutils.DB.Save(&emailPref3), "preparing email preference")
|
||||
testutils.MustExec(t, testutils.DB.Model(&emailPref3).Update(map[string]interface{}{"inactive_reminder": false}), "updating email preference")
|
||||
|
||||
b3 := database.Book{
|
||||
b3 := models.Book{
|
||||
UserID: u3.ID,
|
||||
Label: "js",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b3), "preparing b3")
|
||||
n3 := database.Note{
|
||||
n3 := models.Note{
|
||||
BookUUID: b3.UUID,
|
||||
UserID: u3.ID,
|
||||
}
|
||||
|
|
@ -122,18 +122,18 @@ func TestDoInactive_Cooldown(t *testing.T) {
|
|||
defer testutils.ClearData(testutils.DB)
|
||||
|
||||
// setup sets up an inactive user
|
||||
setup := func(t *testing.T, now time.Time, email string) database.User {
|
||||
setup := func(t *testing.T, now time.Time, email string) models.User {
|
||||
u := testutils.SetupUserData()
|
||||
a := testutils.SetupAccountData(u, email, "pass1234")
|
||||
testutils.MustExec(t, testutils.DB.Model(&a).Update("email_verified", true), "setting email verified")
|
||||
testutils.MustExec(t, testutils.DB.Save(&database.EmailPreference{UserID: u.ID, InactiveReminder: true}), "preparing email preference")
|
||||
testutils.MustExec(t, testutils.DB.Save(&models.EmailPreference{UserID: u.ID, InactiveReminder: true}), "preparing email preference")
|
||||
|
||||
b := database.Book{
|
||||
b := models.Book{
|
||||
UserID: u.ID,
|
||||
Label: "css",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b), "preparing book")
|
||||
n := database.Note{
|
||||
n := models.Note{
|
||||
UserID: u.ID,
|
||||
BookUUID: b.UUID,
|
||||
}
|
||||
|
|
@ -149,20 +149,20 @@ func TestDoInactive_Cooldown(t *testing.T) {
|
|||
setup(t, now, "alice@example.com")
|
||||
|
||||
bob := setup(t, now, "bob@example.com")
|
||||
bobNotif := database.Notification{Type: mailer.EmailTypeInactiveReminder, UserID: bob.ID}
|
||||
bobNotif := models.Notification{Type: mailer.EmailTypeInactiveReminder, UserID: bob.ID}
|
||||
testutils.MustExec(t, testutils.DB.Create(&bobNotif), "preparing inactive notification for bob")
|
||||
testutils.MustExec(t, testutils.DB.Model(&bobNotif).Update("created_at", now.AddDate(0, 0, -7)), "preparing created_at for inactive notification for bob")
|
||||
|
||||
chuck := setup(t, now, "chuck@example.com")
|
||||
chuckNotif := database.Notification{Type: mailer.EmailTypeInactiveReminder, UserID: chuck.ID}
|
||||
chuckNotif := models.Notification{Type: mailer.EmailTypeInactiveReminder, UserID: chuck.ID}
|
||||
testutils.MustExec(t, testutils.DB.Create(&chuckNotif), "preparing inactive notification for chuck")
|
||||
testutils.MustExec(t, testutils.DB.Model(&chuckNotif).Update("created_at", now.AddDate(0, 0, -15)), "preparing created_at for inactive notification for chuck")
|
||||
|
||||
dan := setup(t, now, "dan@example.com")
|
||||
danNotif1 := database.Notification{Type: mailer.EmailTypeInactiveReminder, UserID: dan.ID}
|
||||
danNotif1 := models.Notification{Type: mailer.EmailTypeInactiveReminder, UserID: dan.ID}
|
||||
testutils.MustExec(t, testutils.DB.Create(&danNotif1), "preparing inactive notification 1 for dan")
|
||||
testutils.MustExec(t, testutils.DB.Model(&danNotif1).Update("created_at", now.AddDate(0, 0, -10)), "preparing created_at for inactive notification for dan")
|
||||
danNotif2 := database.Notification{Type: mailer.EmailTypeInactiveReminder, UserID: dan.ID}
|
||||
danNotif2 := models.Notification{Type: mailer.EmailTypeInactiveReminder, UserID: dan.ID}
|
||||
testutils.MustExec(t, testutils.DB.Create(&danNotif2), "preparing inactive notification 2 for dan")
|
||||
testutils.MustExec(t, testutils.DB.Model(&danNotif2).Update("created_at", now.AddDate(0, 0, -15)), "preparing created_at for inactive notification for dan")
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import (
|
|||
"net/http"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/config"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/mailer"
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/joho/godotenv"
|
||||
|
|
@ -121,7 +121,7 @@ type Context struct {
|
|||
|
||||
func main() {
|
||||
c := config.Load()
|
||||
db := database.Open(c)
|
||||
db := models.Open(c)
|
||||
defer db.Close()
|
||||
|
||||
log.Println("Email template development server running on http://127.0.0.1:2300")
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ import (
|
|||
"crypto/rand"
|
||||
"encoding/base64"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
|
@ -40,8 +40,8 @@ func generateRandomToken(bits int) (string, error) {
|
|||
|
||||
// GetToken returns an token of the given kind for the user
|
||||
// by first looking up any unused record and creating one if none exists.
|
||||
func GetToken(db *gorm.DB, userID int, kind string) (database.Token, error) {
|
||||
var tok database.Token
|
||||
func GetToken(db *gorm.DB, userID int, kind string) (models.Token, error) {
|
||||
var tok models.Token
|
||||
conn := db.
|
||||
Where("user_id = ? AND type =? AND used_at IS NULL", userID, kind).
|
||||
First(&tok)
|
||||
|
|
@ -52,7 +52,7 @@ func GetToken(db *gorm.DB, userID int, kind string) (database.Token, error) {
|
|||
}
|
||||
|
||||
if conn.RecordNotFound() {
|
||||
tok = database.Token{
|
||||
tok = models.Token{
|
||||
UserID: userID,
|
||||
Type: kind,
|
||||
Value: tokenVal,
|
||||
|
|
|
|||
|
|
@ -28,9 +28,9 @@ import (
|
|||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/config"
|
||||
"github.com/dnote/dnote/pkg/server/controllers"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/job"
|
||||
"github.com/dnote/dnote/pkg/server/mailer"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/routes"
|
||||
"github.com/jinzhu/gorm"
|
||||
|
||||
|
|
@ -48,7 +48,7 @@ func initDB(c config.Config) *gorm.DB {
|
|||
if err != nil {
|
||||
panic(errors.Wrap(err, "opening database connection"))
|
||||
}
|
||||
database.InitSchema(db)
|
||||
models.InitSchema(db)
|
||||
|
||||
return db
|
||||
}
|
||||
|
|
@ -85,7 +85,7 @@ func startCmd() {
|
|||
app := initApp(cfg)
|
||||
defer app.DB.Close()
|
||||
|
||||
if err := database.Migrate(app.DB); err != nil {
|
||||
if err := models.Migrate(app.DB); err != nil {
|
||||
panic(errors.Wrap(err, "running migrations"))
|
||||
}
|
||||
if err := runJob(app); err != nil {
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
* along with Dnote. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package database
|
||||
package models
|
||||
|
||||
const (
|
||||
// TokenTypeResetPassword is a type of a token for reseting password
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* along with Dnote. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package database
|
||||
package models
|
||||
|
||||
import (
|
||||
"github.com/dnote/dnote/pkg/server/config"
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package database
|
||||
package models
|
||||
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* along with Dnote. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package database
|
||||
package models
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
|
@ -30,7 +30,7 @@ import (
|
|||
// Migrate runs the migrations
|
||||
func Migrate(db *gorm.DB) error {
|
||||
migrations := &migrate.PackrMigrationSource{
|
||||
Box: packr.New("migrations", "../database/migrations/"),
|
||||
Box: packr.New("migrations", "../models/migrations/"),
|
||||
}
|
||||
|
||||
migrate.SetTable(MigrationTableName)
|
||||
|
|
@ -24,7 +24,7 @@ import (
|
|||
"os"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/config"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/joho/godotenv"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/rubenv/sql-migrate"
|
||||
|
|
@ -35,7 +35,7 @@ var (
|
|||
)
|
||||
|
||||
func init() {
|
||||
fmt.Println("Migrating Dnote database...")
|
||||
fmt.Println("Migrating Dnote models...")
|
||||
|
||||
// Load env
|
||||
if os.Getenv("GO_ENV") != "PRODUCTION" {
|
||||
|
|
@ -50,7 +50,7 @@ func main() {
|
|||
flag.Parse()
|
||||
|
||||
c := config.Load()
|
||||
db := database.Open(c)
|
||||
db := models.Open(c)
|
||||
|
||||
migrations := &migrate.FileMigrationSource{
|
||||
Dir: *migrationDir,
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* along with Dnote. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package database
|
||||
package models
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* along with Dnote. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package database
|
||||
package models
|
||||
|
||||
import (
|
||||
"github.com/jinzhu/gorm"
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* along with Dnote. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package database
|
||||
package models
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
|
|
@ -19,7 +19,7 @@
|
|||
package operations
|
||||
|
||||
import (
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/helpers"
|
||||
"github.com/dnote/dnote/pkg/server/permissions"
|
||||
"github.com/jinzhu/gorm"
|
||||
|
|
@ -27,16 +27,16 @@ import (
|
|||
)
|
||||
|
||||
// GetNote retrieves a note for the given user
|
||||
func GetNote(db *gorm.DB, uuid string, user database.User) (database.Note, bool, error) {
|
||||
zeroNote := database.Note{}
|
||||
func GetNote(db *gorm.DB, uuid string, user models.User) (models.Note, bool, error) {
|
||||
zeroNote := models.Note{}
|
||||
if !helpers.ValidateUUID(uuid) {
|
||||
return zeroNote, false, nil
|
||||
}
|
||||
|
||||
conn := db.Where("notes.uuid = ? AND deleted = ?", uuid, false)
|
||||
conn = database.PreloadNote(conn)
|
||||
conn = models.PreloadNote(conn)
|
||||
|
||||
var note database.Note
|
||||
var note models.Note
|
||||
conn = conn.Find(¬e)
|
||||
|
||||
if conn.RecordNotFound() {
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
|
@ -33,13 +33,13 @@ func TestGetNote(t *testing.T) {
|
|||
|
||||
defer testutils.ClearData(testutils.DB)
|
||||
|
||||
b1 := database.Book{
|
||||
b1 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: "js",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), "preparing b1")
|
||||
|
||||
privateNote := database.Note{
|
||||
privateNote := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b1.UUID,
|
||||
Body: "privateNote content",
|
||||
|
|
@ -48,7 +48,7 @@ func TestGetNote(t *testing.T) {
|
|||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&privateNote), "preparing privateNote")
|
||||
|
||||
publicNote := database.Note{
|
||||
publicNote := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b1.UUID,
|
||||
Body: "privateNote content",
|
||||
|
|
@ -57,16 +57,16 @@ func TestGetNote(t *testing.T) {
|
|||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&publicNote), "preparing privateNote")
|
||||
|
||||
var privateNoteRecord, publicNoteRecord database.Note
|
||||
var privateNoteRecord, publicNoteRecord models.Note
|
||||
testutils.MustExec(t, testutils.DB.Where("uuid = ?", privateNote.UUID).Preload("Book").Preload("User").First(&privateNoteRecord), "finding privateNote")
|
||||
testutils.MustExec(t, testutils.DB.Where("uuid = ?", publicNote.UUID).Preload("Book").Preload("User").First(&publicNoteRecord), "finding publicNote")
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
user database.User
|
||||
note database.Note
|
||||
user models.User
|
||||
note models.Note
|
||||
expectedOK bool
|
||||
expectedNote database.Note
|
||||
expectedNote models.Note
|
||||
}{
|
||||
{
|
||||
name: "owner accessing private note",
|
||||
|
|
@ -80,7 +80,7 @@ func TestGetNote(t *testing.T) {
|
|||
user: anotherUser,
|
||||
note: privateNote,
|
||||
expectedOK: false,
|
||||
expectedNote: database.Note{},
|
||||
expectedNote: models.Note{},
|
||||
},
|
||||
{
|
||||
name: "non-owner accessing public note",
|
||||
|
|
@ -91,14 +91,14 @@ func TestGetNote(t *testing.T) {
|
|||
},
|
||||
{
|
||||
name: "guest accessing private note",
|
||||
user: database.User{},
|
||||
user: models.User{},
|
||||
note: privateNote,
|
||||
expectedOK: false,
|
||||
expectedNote: database.Note{},
|
||||
expectedNote: models.Note{},
|
||||
},
|
||||
{
|
||||
name: "guest accessing public note",
|
||||
user: database.User{},
|
||||
user: models.User{},
|
||||
note: publicNote,
|
||||
expectedOK: true,
|
||||
expectedNote: publicNoteRecord,
|
||||
|
|
@ -123,14 +123,14 @@ func TestGetNote_nonexistent(t *testing.T) {
|
|||
|
||||
defer testutils.ClearData(testutils.DB)
|
||||
|
||||
b1 := database.Book{
|
||||
b1 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: "js",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), "preparing b1")
|
||||
|
||||
n1UUID := "4fd19336-671e-4ff3-8f22-662b80e22edc"
|
||||
n1 := database.Note{
|
||||
n1 := models.Note{
|
||||
UUID: n1UUID,
|
||||
UserID: user.ID,
|
||||
BookUUID: b1.UUID,
|
||||
|
|
@ -147,5 +147,5 @@ func TestGetNote_nonexistent(t *testing.T) {
|
|||
}
|
||||
|
||||
assert.Equal(t, ok, false, "ok mismatch")
|
||||
assert.DeepEqual(t, note, database.Note{}, "note mismatch")
|
||||
assert.DeepEqual(t, note, models.Note{}, "note mismatch")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,11 +19,11 @@
|
|||
package permissions
|
||||
|
||||
import (
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
)
|
||||
|
||||
// ViewNote checks if the given user can view the given note
|
||||
func ViewNote(user *database.User, note database.Note) bool {
|
||||
func ViewNote(user *models.User, note models.Note) bool {
|
||||
if note.Public {
|
||||
return true
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
)
|
||||
|
||||
|
|
@ -42,13 +42,13 @@ func TestViewNote(t *testing.T) {
|
|||
|
||||
defer testutils.ClearData(testutils.DB)
|
||||
|
||||
b1 := database.Book{
|
||||
b1 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: "js",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), "preparing b1")
|
||||
|
||||
privateNote := database.Note{
|
||||
privateNote := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b1.UUID,
|
||||
Body: "privateNote content",
|
||||
|
|
@ -57,7 +57,7 @@ func TestViewNote(t *testing.T) {
|
|||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&privateNote), "preparing privateNote")
|
||||
|
||||
publicNote := database.Note{
|
||||
publicNote := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b1.UUID,
|
||||
Body: "privateNote content",
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ package presenters
|
|||
import (
|
||||
"time"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
)
|
||||
|
||||
// Book is a result of PresentBooks
|
||||
|
|
@ -34,7 +34,7 @@ type Book struct {
|
|||
}
|
||||
|
||||
// PresentBook presents a book
|
||||
func PresentBook(book database.Book) Book {
|
||||
func PresentBook(book models.Book) Book {
|
||||
return Book{
|
||||
UUID: book.UUID,
|
||||
USN: book.USN,
|
||||
|
|
@ -45,7 +45,7 @@ func PresentBook(book database.Book) Book {
|
|||
}
|
||||
|
||||
// PresentBooks presents books
|
||||
func PresentBooks(books []database.Book) []Book {
|
||||
func PresentBooks(books []models.Book) []Book {
|
||||
ret := []Book{}
|
||||
|
||||
for _, book := range books {
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ package presenters
|
|||
import (
|
||||
"time"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
)
|
||||
|
||||
// EmailPreference is a presented email digest
|
||||
|
|
@ -33,7 +33,7 @@ type EmailPreference struct {
|
|||
}
|
||||
|
||||
// PresentEmailPreference presents a digest
|
||||
func PresentEmailPreference(p database.EmailPreference) EmailPreference {
|
||||
func PresentEmailPreference(p models.EmailPreference) EmailPreference {
|
||||
ret := EmailPreference{
|
||||
InactiveReminder: p.InactiveReminder,
|
||||
ProductUpdate: p.ProductUpdate,
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ package presenters
|
|||
import (
|
||||
"time"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
)
|
||||
|
||||
// Note is a result of PresentNote
|
||||
|
|
@ -50,7 +50,7 @@ type NoteUser struct {
|
|||
}
|
||||
|
||||
// PresentNote presents note
|
||||
func PresentNote(note database.Note) Note {
|
||||
func PresentNote(note models.Note) Note {
|
||||
ret := Note{
|
||||
UUID: note.UUID,
|
||||
CreatedAt: FormatTS(note.CreatedAt),
|
||||
|
|
@ -72,7 +72,7 @@ func PresentNote(note database.Note) Note {
|
|||
}
|
||||
|
||||
// PresentNotes presents notes
|
||||
func PresentNotes(notes []database.Note) []Note {
|
||||
func PresentNotes(notes []models.Note) []Note {
|
||||
ret := []Note{}
|
||||
|
||||
for _, note := range notes {
|
||||
|
|
|
|||
|
|
@ -7,15 +7,15 @@ import (
|
|||
|
||||
"github.com/dnote/dnote/pkg/server/app"
|
||||
"github.com/dnote/dnote/pkg/server/context"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/log"
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
func authWithToken(db *gorm.DB, r *http.Request, tokenType string, p *AuthParams) (database.User, database.Token, bool, error) {
|
||||
var user database.User
|
||||
var token database.Token
|
||||
func authWithToken(db *gorm.DB, r *http.Request, tokenType string, p *AuthParams) (models.User, models.Token, bool, error) {
|
||||
var user models.User
|
||||
var token models.Token
|
||||
|
||||
query := r.URL.Query()
|
||||
tokenValue := query.Get("token")
|
||||
|
|
@ -131,8 +131,8 @@ func TokenAuth(a *app.App, next http.HandlerFunc, tokenType string, p *AuthParam
|
|||
}
|
||||
|
||||
// AuthWithSession performs user authentication with session
|
||||
func AuthWithSession(db *gorm.DB, r *http.Request, p *AuthParams) (database.User, bool, error) {
|
||||
var user database.User
|
||||
func AuthWithSession(db *gorm.DB, r *http.Request, p *AuthParams) (models.User, bool, error) {
|
||||
var user models.User
|
||||
|
||||
sessionKey, err := GetCredential(r)
|
||||
if err != nil {
|
||||
|
|
@ -142,7 +142,7 @@ func AuthWithSession(db *gorm.DB, r *http.Request, p *AuthParams) (database.User
|
|||
return user, false, nil
|
||||
}
|
||||
|
||||
var session database.Session
|
||||
var session models.Session
|
||||
conn := db.Where("key = ?", sessionKey).First(&session)
|
||||
|
||||
if conn.RecordNotFound() {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
package session
|
||||
|
||||
import (
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
)
|
||||
|
||||
// Session represents user session
|
||||
|
|
@ -13,7 +13,7 @@ type Session struct {
|
|||
}
|
||||
|
||||
// New returns a new session for the given user
|
||||
func New(user database.User, account database.Account) Session {
|
||||
func New(user models.User, account models.Account) Session {
|
||||
return Session{
|
||||
UUID: user.UUID,
|
||||
Pro: user.Cloud,
|
||||
|
|
|
|||
|
|
@ -23,19 +23,19 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
)
|
||||
|
||||
func TestNew(t *testing.T) {
|
||||
u1 := database.User{UUID: "0f5f0054-d23f-4be1-b5fb-57673109e9cb", Cloud: true}
|
||||
a1 := database.Account{Email: database.ToNullString("alice@example.com"), EmailVerified: false}
|
||||
u1 := models.User{UUID: "0f5f0054-d23f-4be1-b5fb-57673109e9cb", Cloud: true}
|
||||
a1 := models.Account{Email: models.ToNullString("alice@example.com"), EmailVerified: false}
|
||||
|
||||
u2 := database.User{UUID: "718a1041-bbe6-496e-bbe4-ea7e572c295e", Cloud: false}
|
||||
a2 := database.Account{Email: database.ToNullString("bob@example.com"), EmailVerified: false}
|
||||
u2 := models.User{UUID: "718a1041-bbe6-496e-bbe4-ea7e572c295e", Cloud: false}
|
||||
a2 := models.Account{Email: models.ToNullString("bob@example.com"), EmailVerified: false}
|
||||
|
||||
testCases := []struct {
|
||||
user database.User
|
||||
account database.Account
|
||||
user models.User
|
||||
account models.Account
|
||||
expectedPro bool
|
||||
}{
|
||||
{
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/config"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/pkg/errors"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
|
|
@ -49,44 +49,44 @@ var DB *gorm.DB
|
|||
func InitTestDB() {
|
||||
c := config.Load()
|
||||
fmt.Println(c.DB.GetConnectionStr())
|
||||
db := database.Open(c)
|
||||
db := models.Open(c)
|
||||
|
||||
database.InitSchema(db)
|
||||
models.InitSchema(db)
|
||||
|
||||
DB = db
|
||||
}
|
||||
|
||||
// ClearData deletes all records from the database
|
||||
func ClearData(db *gorm.DB) {
|
||||
if err := db.Delete(&database.Book{}).Error; err != nil {
|
||||
if err := db.Delete(&models.Book{}).Error; err != nil {
|
||||
panic(errors.Wrap(err, "Failed to clear books"))
|
||||
}
|
||||
if err := db.Delete(&database.Note{}).Error; err != nil {
|
||||
if err := db.Delete(&models.Note{}).Error; err != nil {
|
||||
panic(errors.Wrap(err, "Failed to clear notes"))
|
||||
}
|
||||
if err := db.Delete(&database.Notification{}).Error; err != nil {
|
||||
if err := db.Delete(&models.Notification{}).Error; err != nil {
|
||||
panic(errors.Wrap(err, "Failed to clear notifications"))
|
||||
}
|
||||
if err := db.Delete(&database.User{}).Error; err != nil {
|
||||
if err := db.Delete(&models.User{}).Error; err != nil {
|
||||
panic(errors.Wrap(err, "Failed to clear users"))
|
||||
}
|
||||
if err := db.Delete(&database.Account{}).Error; err != nil {
|
||||
if err := db.Delete(&models.Account{}).Error; err != nil {
|
||||
panic(errors.Wrap(err, "Failed to clear accounts"))
|
||||
}
|
||||
if err := db.Delete(&database.Token{}).Error; err != nil {
|
||||
if err := db.Delete(&models.Token{}).Error; err != nil {
|
||||
panic(errors.Wrap(err, "Failed to clear tokens"))
|
||||
}
|
||||
if err := db.Delete(&database.EmailPreference{}).Error; err != nil {
|
||||
if err := db.Delete(&models.EmailPreference{}).Error; err != nil {
|
||||
panic(errors.Wrap(err, "Failed to clear email preferences"))
|
||||
}
|
||||
if err := db.Delete(&database.Session{}).Error; err != nil {
|
||||
if err := db.Delete(&models.Session{}).Error; err != nil {
|
||||
panic(errors.Wrap(err, "Failed to clear sessions"))
|
||||
}
|
||||
}
|
||||
|
||||
// SetupUserData creates and returns a new user for testing purposes
|
||||
func SetupUserData() database.User {
|
||||
user := database.User{
|
||||
func SetupUserData() models.User {
|
||||
user := models.User{
|
||||
Cloud: true,
|
||||
}
|
||||
|
||||
|
|
@ -98,19 +98,19 @@ func SetupUserData() database.User {
|
|||
}
|
||||
|
||||
// SetupAccountData creates and returns a new account for the user
|
||||
func SetupAccountData(user database.User, email, password string) database.Account {
|
||||
account := database.Account{
|
||||
func SetupAccountData(user models.User, email, password string) models.Account {
|
||||
account := models.Account{
|
||||
UserID: user.ID,
|
||||
}
|
||||
if email != "" {
|
||||
account.Email = database.ToNullString(email)
|
||||
account.Email = models.ToNullString(email)
|
||||
}
|
||||
|
||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
panic(errors.Wrap(err, "Failed to hash password"))
|
||||
}
|
||||
account.Password = database.ToNullString(string(hashedPassword))
|
||||
account.Password = models.ToNullString(string(hashedPassword))
|
||||
|
||||
if err := DB.Save(&account).Error; err != nil {
|
||||
panic(errors.Wrap(err, "Failed to prepare account"))
|
||||
|
|
@ -120,8 +120,8 @@ func SetupAccountData(user database.User, email, password string) database.Accou
|
|||
}
|
||||
|
||||
// SetupSession creates and returns a new user session
|
||||
func SetupSession(t *testing.T, user database.User) database.Session {
|
||||
session := database.Session{
|
||||
func SetupSession(t *testing.T, user models.User) models.Session {
|
||||
session := models.Session{
|
||||
Key: "Vvgm3eBXfXGEFWERI7faiRJ3DAzJw+7DdT9J1LEyNfI=",
|
||||
UserID: user.ID,
|
||||
ExpiresAt: time.Now().Add(time.Hour * 24),
|
||||
|
|
@ -134,8 +134,8 @@ func SetupSession(t *testing.T, user database.User) database.Session {
|
|||
}
|
||||
|
||||
// SetupEmailPreferenceData creates and returns a new email frequency for a user
|
||||
func SetupEmailPreferenceData(user database.User, inactiveReminder bool) database.EmailPreference {
|
||||
frequency := database.EmailPreference{
|
||||
func SetupEmailPreferenceData(user models.User, inactiveReminder bool) models.EmailPreference {
|
||||
frequency := models.EmailPreference{
|
||||
UserID: user.ID,
|
||||
InactiveReminder: inactiveReminder,
|
||||
}
|
||||
|
|
@ -167,13 +167,13 @@ func HTTPDo(t *testing.T, req *http.Request) *http.Response {
|
|||
}
|
||||
|
||||
// SetReqAuthHeader sets the authorization header in the given request for the given user
|
||||
func SetReqAuthHeader(t *testing.T, req *http.Request, user database.User) {
|
||||
func SetReqAuthHeader(t *testing.T, req *http.Request, user models.User) {
|
||||
b := make([]byte, 32)
|
||||
if _, err := rand.Read(b); err != nil {
|
||||
t.Fatal(errors.Wrap(err, "reading random bits"))
|
||||
}
|
||||
|
||||
session := database.Session{
|
||||
session := models.Session{
|
||||
Key: base64.StdEncoding.EncodeToString(b),
|
||||
UserID: user.ID,
|
||||
ExpiresAt: time.Now().Add(time.Hour * 10 * 24),
|
||||
|
|
@ -186,7 +186,7 @@ func SetReqAuthHeader(t *testing.T, req *http.Request, user database.User) {
|
|||
}
|
||||
|
||||
// HTTPAuthDo makes an HTTP request with an appropriate authorization header for a user
|
||||
func HTTPAuthDo(t *testing.T, req *http.Request, user database.User) *http.Response {
|
||||
func HTTPAuthDo(t *testing.T, req *http.Request, user models.User) *http.Response {
|
||||
SetReqAuthHeader(t, req, user)
|
||||
|
||||
return HTTPDo(t, req)
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
|
@ -53,12 +53,12 @@ func TestAppShellExecute(t *testing.T) {
|
|||
defer testutils.ClearData(testutils.DB)
|
||||
|
||||
user := testutils.SetupUserData()
|
||||
b1 := database.Book{
|
||||
b1 := models.Book{
|
||||
UserID: user.ID,
|
||||
Label: "js",
|
||||
}
|
||||
testutils.MustExec(t, testutils.DB.Save(&b1), "preparing b1")
|
||||
n1 := database.Note{
|
||||
n1 := models.Note{
|
||||
UserID: user.ID,
|
||||
BookUUID: b1.UUID,
|
||||
Public: true,
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ import (
|
|||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/handlers"
|
||||
"github.com/dnote/dnote/pkg/server/operations"
|
||||
"github.com/pkg/errors"
|
||||
|
|
@ -47,7 +47,7 @@ type noteMetaTagsData struct {
|
|||
}
|
||||
|
||||
type notePage struct {
|
||||
Note database.Note
|
||||
Note models.Note
|
||||
T *template.Template
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
|
@ -45,8 +45,8 @@ func TestNotePageGetData(t *testing.T) {
|
|||
}
|
||||
|
||||
p := notePage{
|
||||
Note: database.Note{
|
||||
Book: database.Book{
|
||||
Note: models.Note{
|
||||
Book: models.Book{
|
||||
Label: "vocabulary",
|
||||
},
|
||||
AddedOn: time.Date(2019, time.January, 2, 0, 0, 0, 0, time.UTC).UnixNano(),
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ import (
|
|||
"crypto/rand"
|
||||
"encoding/base64"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
|
@ -40,19 +40,19 @@ func generateRandom(bits int) (string, error) {
|
|||
}
|
||||
|
||||
// Create generates a new token in the database
|
||||
func Create(db *gorm.DB, userID int, kind string) (database.Token, error) {
|
||||
func Create(db *gorm.DB, userID int, kind string) (models.Token, error) {
|
||||
val, err := generateRandom(16)
|
||||
if err != nil {
|
||||
return database.Token{}, errors.Wrap(err, "generating random bytes")
|
||||
return models.Token{}, errors.Wrap(err, "generating random bytes")
|
||||
}
|
||||
|
||||
token := database.Token{
|
||||
token := models.Token{
|
||||
UserID: userID,
|
||||
Value: val,
|
||||
Type: kind,
|
||||
}
|
||||
if err := db.Save(&token).Error; err != nil {
|
||||
return database.Token{}, errors.Wrap(err, "creating a token for unsubscribing")
|
||||
return models.Token{}, errors.Wrap(err, "creating a token for unsubscribing")
|
||||
}
|
||||
|
||||
return token, nil
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/dnote/dnote/pkg/assert"
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/dnote/dnote/pkg/server/testutils"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
|
@ -33,7 +33,7 @@ func TestCreate(t *testing.T) {
|
|||
kind string
|
||||
}{
|
||||
{
|
||||
kind: database.TokenTypeEmailPreference,
|
||||
kind: models.TokenTypeEmailPreference,
|
||||
},
|
||||
}
|
||||
|
||||
|
|
@ -52,10 +52,10 @@ func TestCreate(t *testing.T) {
|
|||
|
||||
// Test
|
||||
var count int
|
||||
testutils.MustExec(t, testutils.DB.Model(&database.Token{}).Count(&count), "counting token")
|
||||
testutils.MustExec(t, testutils.DB.Model(&models.Token{}).Count(&count), "counting token")
|
||||
assert.Equalf(t, count, 1, "error mismatch")
|
||||
|
||||
var tokenRecord database.Token
|
||||
var tokenRecord models.Token
|
||||
testutils.MustExec(t, testutils.DB.First(&tokenRecord), "finding token")
|
||||
assert.Equalf(t, tokenRecord.UserID, tok.UserID, "UserID mismatch")
|
||||
assert.Equalf(t, tokenRecord.Value, tok.Value, "Value mismatch")
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import (
|
|||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/dnote/dnote/pkg/server/database"
|
||||
"github.com/dnote/dnote/pkg/server/models"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
|
|
@ -33,7 +33,7 @@ type Alert struct {
|
|||
type Data struct {
|
||||
Alert *Alert
|
||||
CSRF template.HTML
|
||||
User *database.User
|
||||
User *models.User
|
||||
Yield interface{}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue