gitea/modules/context
Jason Song 375fd15fbf
Refactor indexer ()
Refactor `modules/indexer` to make it more maintainable. And it can be
easier to support more features. I'm trying to solve some of issue
searching, this is a precursor to making functional changes.

Current supported engines and the index versions:

| engines | issues | code |
| - | - | - |
| db | Just a wrapper for database queries, doesn't need version | - |
| bleve | The version of index is **2** | The version of index is **6**
|
| elasticsearch | The old index has no version, will be treated as
version **0** in this PR | The version of index is **1** |
| meilisearch | The old index has no version, will be treated as version
**0** in this PR | - |


## Changes

### Split

Splited it into mutiple packages

```text
indexer
├── internal
│   ├── bleve
│   ├── db
│   ├── elasticsearch
│   └── meilisearch
├── code
│   ├── bleve
│   ├── elasticsearch
│   └── internal
└── issues
    ├── bleve
    ├── db
    ├── elasticsearch
    ├── internal
    └── meilisearch
```

- `indexer/interanal`: Internal shared package for indexer.
- `indexer/interanal/[engine]`: Internal shared package for each engine
(bleve/db/elasticsearch/meilisearch).
- `indexer/code`: Implementations for code indexer.
- `indexer/code/internal`: Internal shared package for code indexer.
- `indexer/code/[engine]`: Implementation via each engine for code
indexer.
- `indexer/issues`: Implementations for issues indexer.

### Deduplication

- Combine `Init/Ping/Close` for code indexer and issues indexer.
- ~Combine `issues.indexerHolder` and `code.wrappedIndexer` to
`internal.IndexHolder`.~ Remove it, use dummy indexer instead when the
indexer is not ready.
- Duplicate two copies of creating ES clients.
- Duplicate two copies of `indexerID()`.


### Enhancement

- [x] Support index version for elasticsearch issues indexer, the old
index without version will be treated as version 0.
- [x] Fix spell of `elastic_search/ElasticSearch`, it should be
`Elasticsearch`.
- [x] Improve versioning of ES index. We don't need `Aliases`:
- Gitea does't need aliases for "Zero Downtime" because it never delete
old indexes.
- The old code of issues indexer uses the orignal name to create issue
index, so it's tricky to convert it to an alias.
- [x] Support index version for meilisearch issues indexer, the old
index without version will be treated as version 0.
- [x] Do "ping" only when `Ping` has been called, don't ping
periodically and cache the status.
- [x] Support the context parameter whenever possible.
- [x] Fix outdated example config.
- [x] Give up the requeue logic of issues indexer: When indexing fails,
call Ping to check if it was caused by the engine being unavailable, and
only requeue the task if the engine is unavailable.
- It is fragile and tricky, could cause data losing (It did happen when
I was doing some tests for this PR). And it works for ES only.
- Just always requeue the failed task, if it caused by bad data, it's a
bug of Gitea which should be fixed.

---------

Co-authored-by: Giteabot <teabot@gitea.io>
..
access_log.go Fix regression: access log template, gitea manager cli command ()
api.go Refactor web package and context package ()
api_org.go Implement FSFE REUSE for golang files ()
api_test.go Implement FSFE REUSE for golang files ()
base.go Batch delete issue and improve tippy opts ()
captcha.go Add new captcha: cloudflare turnstile ()
context.go Refactor web package and context package ()
context_cookie.go Improve Gitea's web context, decouple "issue template" code into service package ()
context_model.go Improve Gitea's web context, decouple "issue template" code into service package ()
context_request.go Decouple the different contexts from each other ()
context_response.go Use fetch to send requests to create issues/comments ()
context_test.go Use standard HTTP library to serve files ()
csrf.go Refactor cookie ()
org.go Decouple the different contexts from each other ()
package.go Fix install page context, make the install page tests really test ()
pagination.go Make branches list page operations remember current page ()
permission.go Redesign Scoped Access Tokens ()
private.go Refactor web package and context package ()
repo.go Refactor indexer ()
response.go Refactor web package and context package ()
utils.go Decouple the different contexts from each other ()
xsrf.go Update gitea-vet to check FSFE REUSE ()
xsrf_test.go Update gitea-vet to check FSFE REUSE ()