Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

star.go 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Copyright 2016 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package models
  5. import (
  6. "code.gitea.io/gitea/models/db"
  7. user_model "code.gitea.io/gitea/models/user"
  8. "code.gitea.io/gitea/modules/timeutil"
  9. )
  10. // Star represents a starred repo by an user.
  11. type Star struct {
  12. ID int64 `xorm:"pk autoincr"`
  13. UID int64 `xorm:"UNIQUE(s)"`
  14. RepoID int64 `xorm:"UNIQUE(s)"`
  15. CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
  16. }
  17. func init() {
  18. db.RegisterModel(new(Star))
  19. }
  20. // StarRepo or unstar repository.
  21. func StarRepo(userID, repoID int64, star bool) error {
  22. ctx, committer, err := db.TxContext()
  23. if err != nil {
  24. return err
  25. }
  26. defer committer.Close()
  27. staring := isStaring(db.GetEngine(ctx), userID, repoID)
  28. if star {
  29. if staring {
  30. return nil
  31. }
  32. if err := db.Insert(ctx, &Star{UID: userID, RepoID: repoID}); err != nil {
  33. return err
  34. }
  35. if _, err := db.Exec(ctx, "UPDATE `repository` SET num_stars = num_stars + 1 WHERE id = ?", repoID); err != nil {
  36. return err
  37. }
  38. if _, err := db.Exec(ctx, "UPDATE `user` SET num_stars = num_stars + 1 WHERE id = ?", userID); err != nil {
  39. return err
  40. }
  41. } else {
  42. if !staring {
  43. return nil
  44. }
  45. if _, err := db.DeleteByBean(ctx, &Star{UID: userID, RepoID: repoID}); err != nil {
  46. return err
  47. }
  48. if _, err := db.Exec(ctx, "UPDATE `repository` SET num_stars = num_stars - 1 WHERE id = ?", repoID); err != nil {
  49. return err
  50. }
  51. if _, err := db.Exec(ctx, "UPDATE `user` SET num_stars = num_stars - 1 WHERE id = ?", userID); err != nil {
  52. return err
  53. }
  54. }
  55. return committer.Commit()
  56. }
  57. // IsStaring checks if user has starred given repository.
  58. func IsStaring(userID, repoID int64) bool {
  59. return isStaring(db.GetEngine(db.DefaultContext), userID, repoID)
  60. }
  61. func isStaring(e db.Engine, userID, repoID int64) bool {
  62. has, _ := e.Get(&Star{UID: userID, RepoID: repoID})
  63. return has
  64. }
  65. // GetStargazers returns the users that starred the repo.
  66. func GetStargazers(repo *Repository, opts db.ListOptions) ([]*user_model.User, error) {
  67. sess := db.GetEngine(db.DefaultContext).Where("star.repo_id = ?", repo.ID).
  68. Join("LEFT", "star", "`user`.id = star.uid")
  69. if opts.Page > 0 {
  70. sess = db.SetSessionPagination(sess, &opts)
  71. users := make([]*user_model.User, 0, opts.PageSize)
  72. return users, sess.Find(&users)
  73. }
  74. users := make([]*user_model.User, 0, 8)
  75. return users, sess.Find(&users)
  76. }