-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77
-
78
-
79
-
80
// Copyright 2023 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package repository
import (
"context"
"code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/services/activitypub"
ap "github.com/go-ap/activitypub"
)
// StarRepo or unstar repository.
func StarRepo(ctx context.Context, userID, repoID int64, star bool) error {
repo, err := repo_model.GetRepositoryByID(ctx, repoID)
if err != nil {
return err
}
err = repo.GetOwner(ctx)
if err != nil {
return err
}
if repo.Owner.LoginType == auth.Federated {
// Federated repo
user, err := user_model.GetUserByID(ctx, userID)
if err != nil {
return err
}
var activity *ap.Activity
if star {
activity = activitypub.Star(user, repo)
} else {
activity = activitypub.Unstar(user, repo)
}
err = activitypub.Send(user, activity)
if err != nil {
return err
}
}
err = repo_model.StarRepo(userID, repoID, star)
if err != nil {
return err
}
user, err := user_model.GetUserByID(ctx, userID)
if err != nil {
return err
}
followers, count, err := user_model.GetUserFollowers(ctx, user, user, db.ListOptions{})
if err != nil {
return err
}
note := ap.Note{
Type: ap.NoteType,
ID: ap.IRI(repo.GetIRI()), // TODO: serve the note at an API endpoint
AttributedTo: ap.IRI(user.GetIRI()),
To: ap.ItemCollection{ap.IRI("https://www.w3.org/ns/activitystreams#Public")},
}
note.Content = ap.NaturalLanguageValuesNew()
err = note.Content.Set("en", ap.Content(user.Name+" starred <a href=\""+repo.HTMLURL()+"\">"+repo.FullName()+"</a>"))
if err != nil {
return err
}
create := ap.Create{
Type: ap.CreateType,
Actor: ap.PersonNew(ap.IRI(user.GetIRI())),
Object: note,
To: ap.ItemCollection{},
}
for i := int64(0); i < count; i++ {
if followers[i].LoginType == auth.Federated {
create.To.Append(ap.IRI(followers[i].GetIRI() + "/inbox"))
}
}
return activitypub.Send(user, &create)
}