Files
kimandtobi 1309d1e998 [chore] move packages to external repo (#4610)
# Description

This moves our `internal/{log/util/xslices}` packages out of the gotosocial repo and internal our external `code.superseriousbusiness.org/gopkg` repo. But it maintains an `internal/gtslog` subpkg for initialization of our logging configuration and syslog specifics (which aren't included in the external repo).

## Checklist

- [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md).
- [x] I/we have not used so-called 'AI' to create the proposed changes.
- [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat.
- [x] I/we have performed a self-review of added code.
- [x] I/we have written code that is legible and maintainable by others.
- [x] I/we have commented the added code, particularly in hard-to-understand areas.
- [ ] I/we have made any necessary changes to documentation.
- [ ] I/we have added tests that cover new code.
- [x] I/we have run tests and they pass locally with the changes.
- [x] I/we have run `go fmt ./...` and `golangci-lint run`.

Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4610
Co-authored-by: kim <grufwub@gmail.com>
Co-committed-by: kim <grufwub@gmail.com>
2025-12-08 10:59:43 +01:00

108 lines
3.1 KiB
Go

// GoToSocial
// Copyright (C) GoToSocial Authors admin@gotosocial.org
// SPDX-License-Identifier: AGPL-3.0-or-later
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package cache
import (
"time"
"code.superseriousbusiness.org/gopkg/log"
apimodel "code.superseriousbusiness.org/gotosocial/internal/api/model"
"code.superseriousbusiness.org/gotosocial/internal/config"
"codeberg.org/gruf/go-structr"
)
func (c *Caches) initStatusFilter() {
// Calculate maximum cache size.
cap := calculateResultCacheMax(
sizeofStatusFilterResults(), // model in-mem size.
config.GetCacheStatusFilterMemRatio(),
)
log.Infof(nil, "cache size = %d", cap)
copyF := func(r1 *CachedStatusFilterResults) *CachedStatusFilterResults {
r2 := new(CachedStatusFilterResults)
*r2 = *r1
return r2
}
c.StatusFilter.Init(structr.CacheConfig[*CachedStatusFilterResults]{
Indices: []structr.IndexConfig{
{Fields: "RequesterID,StatusID"},
{Fields: "StatusID", Multiple: true},
{Fields: "RequesterID", Multiple: true},
},
MaxSize: cap,
IgnoreErr: func(err error) bool {
// don't cache any errors,
// it gets a little too tricky
// otherwise with ensuring
// errors are cleared out
return true
},
Copy: copyF,
})
}
const (
KeyContextHome = iota
KeyContextPublic
KeyContextNotifs
KeyContextThread
KeyContextAccount
keysLen // must always be last in list
)
// CachedStatusFilterResults contains the
// results of a cached status filter lookup.
type CachedStatusFilterResults struct {
// StatusID is the ID of the
// status this is a result for.
StatusID string
// RequesterID is the ID of the requesting
// account for this status filter lookup.
RequesterID string
// Results is a map (int-key-array) of status filter
// result slices in all possible filtering contexts.
Results [keysLen][]StatusFilterResult
}
// StatusFilterResult stores a single (positive,
// i.e. match) filter result for a status by a filter.
type StatusFilterResult struct {
// Expiry stores the time at which
// (if any) the filter result expires.
Expiry time.Time
// Result stores any generated filter result for
// this match intended to be shown at the frontend.
// This can be used to determine the filter action:
// - value => gtsmodel.FilterActionWarn
// - nil => gtsmodel.FilterActionHide
Result *apimodel.FilterResult
}
// Expired returns whether the filter result has expired.
func (r *StatusFilterResult) Expired(now time.Time) bool {
return !r.Expiry.IsZero() && !r.Expiry.After(now)
}