mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-10-31 14:31:02 +00:00 
			
		
		
		
	This PR is part of https://codeberg.org/forgejo/forgejo/pulls/4767 This should not have an outside impact but bring all model changes needed & bring migrations. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8078 Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org> Co-authored-by: Michael Jerger <michael.jerger@meissa-gmbh.de> Co-committed-by: Michael Jerger <michael.jerger@meissa-gmbh.de>
		
			
				
	
	
		
			106 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2024 The Forgejo Authors. All rights reserved.
 | |
| // SPDX-License-Identifier: MIT
 | |
| 
 | |
| package activities
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 
 | |
| 	"forgejo.org/models/db"
 | |
| 	user_model "forgejo.org/models/user"
 | |
| 	"forgejo.org/modules/json"
 | |
| 	"forgejo.org/modules/log"
 | |
| 	"forgejo.org/modules/timeutil"
 | |
| 	"forgejo.org/modules/validation"
 | |
| 
 | |
| 	ap "github.com/go-ap/activitypub"
 | |
| )
 | |
| 
 | |
| type FederatedUserActivity struct {
 | |
| 	ID           int64 `xorm:"pk autoincr"`
 | |
| 	UserID       int64 `xorm:"NOT NULL"`
 | |
| 	ActorID      int64
 | |
| 	ActorURI     string
 | |
| 	Actor        *user_model.User   `xorm:"-"` // transient
 | |
| 	NoteContent  string             `xorm:"TEXT"`
 | |
| 	NoteURL      string             `xorm:"VARCHAR(255)"`
 | |
| 	OriginalNote string             `xorm:"TEXT"`
 | |
| 	Created      timeutil.TimeStamp `xorm:"created"`
 | |
| }
 | |
| 
 | |
| func init() {
 | |
| 	db.RegisterModel(new(FederatedUserActivity))
 | |
| }
 | |
| 
 | |
| func NewFederatedUserActivity(userID, actorID int64, actorURI, noteContent, noteURL string, originalNote ap.Activity) (FederatedUserActivity, error) {
 | |
| 	jsonString, err := json.Marshal(originalNote)
 | |
| 	if err != nil {
 | |
| 		return FederatedUserActivity{}, err
 | |
| 	}
 | |
| 	result := FederatedUserActivity{
 | |
| 		UserID:       userID,
 | |
| 		ActorID:      actorID,
 | |
| 		ActorURI:     actorURI,
 | |
| 		NoteContent:  noteContent,
 | |
| 		NoteURL:      noteURL,
 | |
| 		OriginalNote: string(jsonString),
 | |
| 	}
 | |
| 	if valid, err := validation.IsValid(result); !valid {
 | |
| 		return FederatedUserActivity{}, err
 | |
| 	}
 | |
| 	return result, nil
 | |
| }
 | |
| 
 | |
| func (federatedUserActivity FederatedUserActivity) Validate() []string {
 | |
| 	var result []string
 | |
| 	result = append(result, validation.ValidateNotEmpty(federatedUserActivity.UserID, "UserID")...)
 | |
| 	result = append(result, validation.ValidateNotEmpty(federatedUserActivity.ActorID, "ActorID")...)
 | |
| 	result = append(result, validation.ValidateNotEmpty(federatedUserActivity.ActorURI, "ActorURI")...)
 | |
| 	result = append(result, validation.ValidateNotEmpty(federatedUserActivity.NoteContent, "NoteContent")...)
 | |
| 	result = append(result, validation.ValidateNotEmpty(federatedUserActivity.NoteURL, "NoteURL")...)
 | |
| 	result = append(result, validation.ValidateNotEmpty(federatedUserActivity.OriginalNote, "OriginalNote")...)
 | |
| 	return result
 | |
| }
 | |
| 
 | |
| func CreateUserActivity(ctx context.Context, federatedUserActivity *FederatedUserActivity) error {
 | |
| 	if valid, err := validation.IsValid(federatedUserActivity); !valid {
 | |
| 		return err
 | |
| 	}
 | |
| 	_, err := db.GetEngine(ctx).Insert(federatedUserActivity)
 | |
| 	return err
 | |
| }
 | |
| 
 | |
| type GetFollowingFeedsOptions struct {
 | |
| 	db.ListOptions
 | |
| }
 | |
| 
 | |
| func GetFollowingFeeds(ctx context.Context, actorID int64, opts GetFollowingFeedsOptions) ([]*FederatedUserActivity, int64, error) {
 | |
| 	log.Debug("user_id = %s", actorID)
 | |
| 	sess := db.GetEngine(ctx).Where("user_id = ?", actorID)
 | |
| 	opts.SetDefaultValues()
 | |
| 	sess = db.SetSessionPagination(sess, &opts)
 | |
| 
 | |
| 	actions := make([]*FederatedUserActivity, 0, opts.PageSize)
 | |
| 	count, err := sess.FindAndCount(&actions)
 | |
| 	if err != nil {
 | |
| 		return nil, 0, fmt.Errorf("FindAndCount: %w", err)
 | |
| 	}
 | |
| 	for _, act := range actions {
 | |
| 		if err := act.loadActor(ctx); err != nil {
 | |
| 			return nil, 0, err
 | |
| 		}
 | |
| 	}
 | |
| 	return actions, count, err
 | |
| }
 | |
| 
 | |
| func (federatedUserActivity *FederatedUserActivity) loadActor(ctx context.Context) error {
 | |
| 	log.Debug("for activity %s", federatedUserActivity)
 | |
| 	actorUser, _, err := user_model.GetFederatedUserByUserID(ctx, federatedUserActivity.ActorID)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	federatedUserActivity.Actor = actorUser
 | |
| 
 | |
| 	return nil
 | |
| }
 |