This repository has been archived on 2024-01-04. You can view files and clone it, but cannot push or open issues or pull requests.
forgejo/services/repository/star.go

72 lines
1.8 KiB
Go

// Copyright 2023 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package repository
import (
"context"
"code.gitea.io/gitea/models/auth"
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.LoadOwner(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(ctx, 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
}
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{ap.IRI(user.GetIRI() + "/followers")},
}
return activitypub.Send(ctx, user, &create)
}