diff --git a/db/gorm.go b/db/gorm.go index eeb5226e..838a56b8 100644 --- a/db/gorm.go +++ b/db/gorm.go @@ -31,8 +31,8 @@ func GormInit(conf *config.Config) (*gorm.DB, error) { if config.Environment == "DEVELOPMENT" { db.LogMode(true) // db.DropTable(&model.User{}, "UserFollower") - db.AutoMigrate(&model.Torrents{}, &model.UsersFollowers{}, &model.User{}, &model.Role{}, &model.Language{}, &model.Comment{}) - // db.AutoMigrate(&model.Comment{}) + db.AutoMigrate(&model.User{}, &model.UserFollows{}) + db.AutoMigrate(&model.User{}, &model.Torrents{}, &model.Comment{}, &model.OldComment{}) // db.Model(&model.User{}).AddIndex("idx_user_token", "token") } diff --git a/model/comment.go b/model/comment.go index 721c0183..76307e16 100644 --- a/model/comment.go +++ b/model/comment.go @@ -4,16 +4,28 @@ import ( "time" ) -// Comment is a comment model. type Comment struct { - Id int `json:"id"` - Content string `json:"content"` - UserId int `json:"userId"` - Username string `json:"username"` // this is duplicate but it'll be faster rite? - TorrentId int - // LikingCount int `json:"likingCount"` - CreatedAt time.Time `json:"createdAt"` - UpdatedAt time.Time `json:"updatedAt"` - DeletedAt *time.Time `json:"deletedAt""` - User User `json:"user"` + Id uint `gorm:"column:comment_id;primary_key"` + TorrentId uint `gorm:"column:torrent_id"` + UserId uint `gorm:"column:user_id"` + Content string `gorm:"column:content"` + CreatedAt time.Time `gorm:"column:created_at"` + UpdatedAt time.Time `gorm:"column:updated_at"` + + Torrent *Torrents `gorm:"ForeignKey:TorrentId"` + User *User `gorm:"ForeignKey:UserId"` +} + +type OldComment struct { + TorrentId uint `gorm:"column:torrent_id"` + Username string `gorm:"column:username"` + Content string `gorm:"column:content"` + Date time.Time `gorm:"column:date"` + + Torrent *Torrents `gorm:"ForeignKey:TorrentId"` +} + +func (c OldComment) TableName() string { + // cba to renamed this in the db + return "comments_old" } diff --git a/model/role.go b/model/role.go deleted file mode 100644 index c5689078..00000000 --- a/model/role.go +++ /dev/null @@ -1,8 +0,0 @@ -package model - -// Role is a role model for user permission. -type Role struct { - Id uint `json:"id"` - Name string `json:"name",sql:"size:255"` - Description string `json:"description",sql:"size:255"` -} diff --git a/model/status.go b/model/status.go deleted file mode 100644 index 2dfdc346..00000000 --- a/model/status.go +++ /dev/null @@ -1,7 +0,0 @@ -package model - -//user status e.g. verified, filtered, etc -type Status struct { - Id int `json:"id"` - Name string `json:"name",sql:"size:255"` -} diff --git a/model/torrent.go b/model/torrent.go index e3ab1c1e..4cc5597d 100644 --- a/model/torrent.go +++ b/model/torrent.go @@ -4,7 +4,7 @@ import ( "github.com/ewhal/nyaa/config" "github.com/ewhal/nyaa/util" - "encoding/json" +// "encoding/json" "html" "html/template" "strconv" @@ -21,18 +21,23 @@ type Feed struct { } type Torrents struct { - Id int `gorm:"column:torrent_id;primary_key"` - Name string `gorm:"column:torrent_name"` - Category int `gorm:"column:category_id"` - Sub_Category int `gorm:"column:sub_category_id"` - Status int `gorm:"column:status_id"` - Hash string `gorm:"column:torrent_hash"` - Date int64 `gorm:"column:date"` - Downloads int `gorm:"column:downloads"` - Filesize int64 `gorm:"column:filesize"` - Description string `gorm:"column:description"` - OldComments []byte `gorm:"column:comments"` - Comments []Comment `gorm:"ForeignKey:TorrentId"` + Id uint `gorm:"column:torrent_id;primary_key"` + Name string `gorm:"column:torrent_name"` + Hash string `gorm:"column:torrent_hash"` + Category int `gorm:"column:category"` + Sub_Category int `gorm:"column:sub_category"` + Status int `gorm:"column:status"` + Date time.Time `gorm:"column:date"` + UploaderId uint `gorm:"column:uploader"` + Downloads int `gorm:"column:downloads"` + Stardom int `gorm:"column:stardom"` + Filesize int64 `gorm:"column:filesize"` + Description string `gorm:"column:description"` + WebsiteLink string `gorm:"column:website_link"` + + Uploader *User `gorm:"ForeignKey:UploaderId"` + OldComments []OldComment `gorm:"ForeignKey:Id"` + Comments []Comment `gorm:"ForeignKey:Id"` } /* We need JSON Object instead because of Magnet URL that is not in the database but generated dynamically @@ -80,9 +85,9 @@ type TorrentsJson struct { func (t *Torrents) ToJson() TorrentsJson { magnet := util.InfoHashToMagnet(strings.TrimSpace(t.Hash), t.Name, config.Trackers...) - offset := 0 + //offset := 0 var commentsJson []CommentsJson - if len(t.OldComments) != 0 { + /*if len(t.OldComments) != 0 { b := []OldCommentsJson{} err := json.Unmarshal([]byte(t.OldComments), &b) if err == nil { @@ -100,13 +105,13 @@ func (t *Torrents) ToJson() TorrentsJson { } for i, comment := range t.Comments { commentsJson[i+offset] = CommentsJson{Content: template.HTML(comment.Content), Username: comment.Username} - } + }*/ res := TorrentsJson{ - Id: strconv.Itoa(t.Id), + Id: strconv.FormatUint(uint64(t.Id), 10), Name: html.UnescapeString(t.Name), Status: t.Status, Hash: t.Hash, - Date: time.Unix(t.Date, 0).Format(time.RFC3339), + Date: t.Date.Format(time.RFC3339), Filesize: util.FormatFilesize2(t.Filesize), Description: template.HTML(t.Description), Comments: commentsJson, diff --git a/model/user.go b/model/user.go index 3a041fcc..05c5cfce 100644 --- a/model/user.go +++ b/model/user.go @@ -7,78 +7,27 @@ import ( // omit is the bool type for omitting a field of struct. type omit bool -// User is a user model type User struct { - Id uint `json:"id"` - - Email string `json:"email",sql:"size:255;unique"` - Password string `json:"password",sql:"size:255"` - Username string `json:"username",sql:"size:255;unique"` - Description string `json:"description",sql:"size:100"` - Token string `json:"token"` - TokenExpiration time.Time `json:"tokenExperiation"` - - // email md5 for gravatar - Md5 string `json:"md5"` - - // admin - Activation bool `json:"activation"` - PasswordResetToken string `json:"passwordResetToken"` - ActivationToken string `json:"activationToken"` - PasswordResetUntil time.Time `json:"passwordResetUntil"` - ActivateUntil time.Time `json:"activateUntil"` - ActivatedAt time.Time `json:"activatedAt"` - CreatedAt time.Time `json:"createdAt"` - UpdatedAt time.Time `json:"updatedAt"` - DeletedAt *time.Time `json:"deletedAt"` - LastLoginAt time.Time `json:"lastLoginAt"` - CurrentLoginAt time.Time `json:"currentLoginAt"` - LastLoginIp string `json:"lastLoginIp",sql:"size:100"` - CurrentLoginIp string `json:"currentLoginIp",sql:"size:100"` - - // Liking - LikingCount int `json:"likingCount"` - LikedCount int `json:"likedCount"` - Likings []User `gorm:"foreignkey:userId;associationforeignkey:follower_id;many2many:users_followers;"` - Liked []User `gorm:"foreignkey:follower_id;associationforeignkey:userId;many2many:users_followers;"` - - //Connections []Connection - - Languages string - Roles []Role `gorm:"many2many:users_roles;"` // Many To Many, users_roles - Torrents []Torrents + Id uint `gorm:"column:user_id;primary_key"` + Username string `gorm:"column:username"` + Password string `gorm:"column:password"` + Email string `gorm:"column:email"` + Status int `gorm:"column:status"` + CreatedAt time.Time `gorm:"column:created_at"` + UpdatedAt time.Time `gorm:"column:updated_at"` + /*Api*/Token string `gorm:"column:api_token"` + //ApiTokenExpiry + TokenExpiration time.Time `gorm:"column:api_token_expiry"` + Language string `gorm:"column:language"` } -// UsersFollowers is a relation table to relate users each other. -type UsersFollowers struct { - UserID uint `json:"user_id"` - FollowerID uint `json:"follower_id"` -} - -// PublicUser is a public user model that contains only a few information for everyone. type PublicUser struct { - *User - Email omit `json:"email,omitempty",sql:"size:255;unique"` - Password omit `json:"password,omitempty",sql:"size:255"` - Token omit `json:"token,omitempty"` - TokenExpiration omit `json:"tokenExperiation,omitempty"` - - // admin - Activation omit `json:"activation,omitempty"` - PasswordResetToken omit `json:"passwordResetToken,omitempty"` - ActivationToken omit `json:"activationToken,omitempty"` - PasswordResetUntil omit `json:"passwordResetUntil,omitempty"` - ActivateUntil omit `json:"activateUntil,omitempty"` - ActivatedAt omit `json:"activatedAt,omitempty"` - UpdatedAt omit `json:"updatedAt,omitempty"` - DeletedAt omit `json:"deletedAt,omitempty"` - LastLoginAt omit `json:"lastLoginAt,omitempty"` - CurrentLoginAt omit `json:"currentLoginAt,omitempty"` - LastLoginIp omit `json:"lastLoginIp,omitempty",sql:"size:100"` - CurrentLoginIp omit `json:"currentLoginIp,omitempty",sql:"size:100"` - - //Connections omit `json:"connections,omitempty"` - Languages omit `json:"languages,omitempty"` - Roles omit `json:"roles,omitempty"` - Torrents omit `json:"articles,omitempty"` //should user torrents not be displayed? + User *User } + +type UserFollows struct { + User User `gorm:"ForeignKey:user_id"` + Following User `gorm:"ForeignKey:following"` +} + + diff --git a/router/apiHandler.go b/router/apiHandler.go index 46a4c7d5..d7139a01 100644 --- a/router/apiHandler.go +++ b/router/apiHandler.go @@ -100,7 +100,7 @@ func ApiUploadHandler(w http.ResponseWriter, r *http.Request) { Sub_Category: sub_category, Status: 1, Hash: b.Hash, - Date: time.Now().Unix(), + Date: time.Now(), Filesize: 0, Description: string(b.Description)} db.ORM.Create(&torrent) diff --git a/router/rssHandler.go b/router/rssHandler.go index 402dafd2..c86656a9 100644 --- a/router/rssHandler.go +++ b/router/rssHandler.go @@ -15,7 +15,7 @@ func RssHandler(w http.ResponseWriter, r *http.Request) { created_as_time := time.Now() if len(torrents) > 0 { - created_as_time = time.Unix(torrents[0].Date, 0) + created_as_time = torrents[0].Date } feed := &feeds.Feed{ Title: "Nyaa Pantsu", @@ -26,16 +26,15 @@ func RssHandler(w http.ResponseWriter, r *http.Request) { feed.Items = make([]*feeds.Item, len(torrents)) for i, _ := range torrents { - timestamp_as_time := time.Unix(torrents[0].Date, 0) torrent_json := torrents[i].ToJson() feed.Items[i] = &feeds.Item{ // need a torrent view first - Id: "https://nyaa.pantsu.cat/view/" + strconv.Itoa(torrents[i].Id), + Id: "https://" + config.WebAddress + "/view/" + strconv.FormatUint(uint64(torrents[i].Id), 10), Title: torrents[i].Name, Link: &feeds.Link{Href: string(torrent_json.Magnet)}, Description: "", - Created: timestamp_as_time, - Updated: timestamp_as_time, + Created: torrents[0].Date, + Updated: torrents[0].Date, } } diff --git a/router/uploadHandler.go b/router/uploadHandler.go index 5e9481ac..2aeed5cf 100644 --- a/router/uploadHandler.go +++ b/router/uploadHandler.go @@ -33,12 +33,12 @@ func UploadHandler(w http.ResponseWriter, r *http.Request) { Sub_Category: uploadForm.SubCategoryId, Status: 1, Hash: uploadForm.Infohash, - Date: time.Now().Unix(), + Date: time.Now(), Filesize: uploadForm.Filesize, // FIXME: should set to NULL instead of 0 Description: uploadForm.Description} db.ORM.Create(&torrent) fmt.Printf("%+v\n", torrent) - url, err := Router.Get("view_torrent").URL("id", strconv.Itoa(torrent.Id)) + url, err := Router.Get("view_torrent").URL("id", strconv.FormatUint(uint64(torrent.Id), 10)) if err == nil { http.Redirect(w, r, url.String(), 302) } diff --git a/router/viewTorrentHandler.go b/router/viewTorrentHandler.go index a63cfd4f..d9239722 100644 --- a/router/viewTorrentHandler.go +++ b/router/viewTorrentHandler.go @@ -3,6 +3,7 @@ package router import ( "net/http" "strconv" + "time" "github.com/ewhal/nyaa/db" "github.com/ewhal/nyaa/model" @@ -41,14 +42,13 @@ func PostCommentHandler(w http.ResponseWriter, r *http.Request) { currentUser := GetUser(r) content := p.Sanitize(r.FormValue("comment")) - idNum, err := strconv.Atoi(id) - username := "れんちょん" - userId := 0 + idNum_, err := strconv.Atoi(id) + var idNum uint = uint(idNum_) + var userId uint = 0 if (currentUser.Id > 0) { - username = currentUser.Username - userId = int(currentUser.Id) + userId = currentUser.Id } - comment := model.Comment{Username: username, UserId: userId, Content: content, TorrentId: idNum} + comment := model.Comment{TorrentId: idNum, UserId: userId, Content: content, CreatedAt: time.Now()} db.ORM.Create(&comment) url, err := Router.Get("view_torrent").URL("id", id) diff --git a/service/user/cookieHelper.go b/service/user/cookieHelper.go index 80ef3f71..55a1b811 100644 --- a/service/user/cookieHelper.go +++ b/service/user/cookieHelper.go @@ -150,6 +150,6 @@ func CurrentUser(r *http.Request) (model.User, error) { if db.ORM.Select(config.UserPublicFields+", email").Where("token = ?", token).First(&user).RecordNotFound() { return user, errors.New("User is not found.") } - db.ORM.Model(&user).Association("Roles").Find(&user.Roles) + db.ORM.Model(&user) return user, nil } diff --git a/service/user/user.go b/service/user/user.go index 24645344..9c7e28db 100644 --- a/service/user/user.go +++ b/service/user/user.go @@ -4,6 +4,7 @@ import ( "errors" "net/http" "strconv" + "time" "golang.org/x/crypto/bcrypt" @@ -56,7 +57,6 @@ func CreateUserFromForm(registrationForm formStruct.RegistrationForm) (model.Use var user model.User log.Debugf("registrationForm %+v\n", registrationForm) modelHelper.AssignValue(&user, ®istrationForm) - user.Md5 = crypto.GenerateMD5Hash(user.Email) // Gravatar token, err := crypto.GenerateRandomToken32() if err != nil { return user, errors.New("Token not generated.") @@ -101,7 +101,7 @@ func CreateUser(w http.ResponseWriter, r *http.Request) (int, error) { // RetrieveUser retrieves a user. func RetrieveUser(r *http.Request, id string) (*model.PublicUser, bool, uint, int, error) { - var user model.User + /*var user model.User var currentUserId uint var isAuthor bool // var publicUser *model.PublicUser @@ -139,7 +139,8 @@ func RetrieveUser(r *http.Request, id string) (*model.PublicUser, bool, uint, in log.Debugf("user liking %v\n", user.Likings) log.Debugf("user liked %v\n", user.Liked) - return &model.PublicUser{User: &user}, isAuthor, currentUserId, http.StatusOK, nil + return &model.PublicUser{User: &user}, isAuthor, currentUserId, http.StatusOK, nil*/ + return nil, false, 0, 0, errors.New("NotImpl") } // RetrieveUsers retrieves users. @@ -155,7 +156,6 @@ func RetrieveUsers() []*model.PublicUser { // UpdateUserCore updates a user. (Applying the modifed data of user). func UpdateUserCore(user *model.User) (int, error) { - user.Md5 = crypto.GenerateMD5Hash(user.Email) token, err := crypto.GenerateRandomToken32() if err != nil { return http.StatusInternalServerError, errors.New("Token not generated.") @@ -165,6 +165,7 @@ func UpdateUserCore(user *model.User) (int, error) { if db.ORM.Save(user).Error != nil { return http.StatusInternalServerError, errors.New("User is not updated.") } + user.UpdatedAt = time.Now() return http.StatusOK, nil } @@ -220,49 +221,6 @@ func DeleteUser(w http.ResponseWriter, id string) (int, error) { return status, err } -// AddRoleToUser adds a role to a user. -func AddRoleToUser(r *http.Request) (int, error) { - var form formStruct.UserRoleForm - var user model.User - var role model.Role - var roles []model.Role - modelHelper.BindValueForm(&form, r) - - if db.ORM.First(&user, form.UserId).RecordNotFound() { - return http.StatusNotFound, errors.New("User is not found.") - } - if db.ORM.First(&role, form.RoleId).RecordNotFound() { - return http.StatusNotFound, errors.New("Role is not found.") - } - log.Debugf("user email : %s", user.Email) - log.Debugf("Role name : %s", role.Name) - db.ORM.Model(&user).Association("Roles").Append(role) - db.ORM.Model(&user).Association("Roles").Find(&roles) - if db.ORM.Save(&user).Error != nil { - return http.StatusInternalServerError, errors.New("Role not appended to user.") - } - return http.StatusOK, nil -} - -// RemoveRoleFromUser removes a role from a user. -func RemoveRoleFromUser(w http.ResponseWriter, r *http.Request, userId string, roleId string) (int, error) { - var user model.User - var role model.Role - if db.ORM.First(&user, userId).RecordNotFound() { - return http.StatusNotFound, errors.New("User is not found.") - } - if db.ORM.First(&role, roleId).RecordNotFound() { - return http.StatusNotFound, errors.New("Role is not found.") - } - - log.Debugf("user : %v\n", user) - log.Debugf("role : %v\n", role) - if db.ORM.Model(&user).Association("Roles").Delete(role).Error != nil { - return http.StatusInternalServerError, errors.New("Role is not deleted from user.") - } - return http.StatusOK, nil -} - // RetrieveCurrentUser retrieves a current user. func RetrieveCurrentUser(r *http.Request) (model.User, int, error) { user, err := CurrentUser(r) @@ -307,8 +265,7 @@ func RetrieveUserForAdmin(id string) (model.User, int, error) { if db.ORM.First(&user, id).RecordNotFound() { return user, http.StatusNotFound, errors.New("User is not found.") } - db.ORM.Model(&user).Association("Languages").Find(&user.Languages) - db.ORM.Model(&user).Association("Roles").Find(&user.Roles) + db.ORM.Model(&user) return user, http.StatusOK, nil } @@ -318,8 +275,7 @@ func RetrieveUsersForAdmin() []model.User { var userArr []model.User db.ORM.Find(&users) for _, user := range users { - db.ORM.Model(&user).Association("Languages").Find(&user.Languages) - db.ORM.Model(&user).Association("Roles").Find(&user.Roles) + db.ORM.Model(&user) userArr = append(userArr, user) } return userArr @@ -328,7 +284,7 @@ func RetrieveUsersForAdmin() []model.User { // ActivateUser toggle activation of a user. func ActivateUser(r *http.Request, id string) (model.User, int, error) { var user model.User - var form formStruct.ActivateForm + /*var form formStruct.ActivateForm modelHelper.BindValueForm(&form, r) if db.ORM.First(&user, id).RecordNotFound() { return user, http.StatusNotFound, errors.New("User is not found.") @@ -337,7 +293,8 @@ func ActivateUser(r *http.Request, id string) (model.User, int, error) { if db.ORM.Save(&user).Error != nil { return user, http.StatusInternalServerError, errors.New("User not activated.") } - return user, http.StatusOK, nil + return user, http.StatusOK, nil*/ + return user, 0, errors.New("NotImpl") } // CreateUserAuthentication creates user authentication. diff --git a/service/user/verification.go b/service/user/verification.go index 37672cb5..6a888b49 100644 --- a/service/user/verification.go +++ b/service/user/verification.go @@ -3,15 +3,15 @@ package userService import ( "errors" "net/http" - "time" +// "time" "github.com/ewhal/nyaa/config" "github.com/ewhal/nyaa/db" "github.com/ewhal/nyaa/model" - "github.com/ewhal/nyaa/util/crypto" +// "github.com/ewhal/nyaa/util/crypto" "github.com/ewhal/nyaa/util/email" - "github.com/ewhal/nyaa/util/log" - "github.com/ewhal/nyaa/util/timeHelper" +// "github.com/ewhal/nyaa/util/log" +// "github.com/ewhal/nyaa/util/timeHelper" "github.com/nicksnyder/go-i18n/i18n" ) @@ -28,7 +28,7 @@ func SendEmailVerfication(to string, token string, locale string) error { // SendVerificationToUser sends an email verification token to user. func SendVerificationToUser(user model.User) (int, error) { - var status int + /*var status int var err error user.ActivateUntil = timeHelper.TwentyFourHoursLater() user.ActivationToken, err = crypto.GenerateRandomToken32() @@ -45,12 +45,12 @@ func SendVerificationToUser(user model.User) (int, error) { if err != nil { return http.StatusInternalServerError, err } - return http.StatusOK, err + return http.StatusOK, err*/ + return 0, errors.New("NotImpl") } // SendVerification sends an email verification token. func SendVerification(r *http.Request) (int, error) { - var user model.User currentUser, err := CurrentUser(r) if err != nil { @@ -65,7 +65,7 @@ func SendVerification(r *http.Request) (int, error) { // EmailVerification verifies an email of user. func EmailVerification(token string,w http.ResponseWriter) (int, error) { - var user model.User + /*var user model.User log.Debugf("verifyEmailForm.ActivationToken : %s", token) if db.ORM.Where(&model.User{ActivationToken: token}).First(&user).RecordNotFound() { return http.StatusNotFound, errors.New("User is not found.") @@ -85,5 +85,6 @@ func EmailVerification(token string,w http.ResponseWriter) (int, error) { return status, err } status, err = SetCookie(w, user.Token) - return status, err + return status, err*/ + return 0, errors.New("NotImpl") }