Ctrl K
ComunidadGuías…

store/memo_comment.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package store

// MemoCommentAuthorizationSnapshot is the memo-local database state read by a
// driver before it creates an immutable COMMENT relation.
type MemoCommentAuthorizationSnapshot struct {
	ActorUserID int32
	Actor       MemoActorState

	ContextID         int32
	ContextCreatorID  int32
	ContextRowStatus  RowStatus
	ContextVisibility Visibility
	ContextSpaceID    *int32

	ContextSpaceExists  bool
	ContextMemberActive bool
}

// ValidateMemoCommentAuthorization validates participation in the context
// memo. The replying memo is authorized independently by the normal memo-create
// policy; no placement or audience is inherited from this snapshot.
func ValidateMemoCommentAuthorization(snapshot *MemoCommentAuthorizationSnapshot) error {
	if snapshot == nil || snapshot.ActorUserID <= 0 || !snapshot.Actor.Active {
		return ErrMemoPermissionDenied
	}
	if snapshot.ContextID <= 0 || snapshot.ContextRowStatus != Normal || !isValidVisibility(snapshot.ContextVisibility) {
		return ErrMemoSpaceNotWritable
	}
	if snapshot.ContextSpaceID == nil && snapshot.ContextVisibility == SpaceAudience {
		return ErrMemoSpaceNotWritable
	}
	if snapshot.ContextSpaceID != nil && !snapshot.ContextSpaceExists {
		return ErrMemoSpaceNotWritable
	}
	// An instance administrator participates in any structurally valid memo.
	if snapshot.Actor.Admin {
		return nil
	}
	// Participation in an assigned memo is narrower than reading it: active
	// membership is required even for PUBLIC and PROTECTED audiences.
	if snapshot.ContextSpaceID != nil && !snapshot.ContextMemberActive {
		return ErrMemoSpaceMembershipRequired
	}

	switch snapshot.ContextVisibility {
	case Private:
		if snapshot.ContextCreatorID != snapshot.ActorUserID {
			return ErrMemoPermissionDenied
		}
	case Protected, Public, SpaceAudience:
		// Any audience-specific placement and membership requirements were
		// validated above.
	default:
		return ErrMemoSpaceNotWritable
	}
	return nil
}