gitea源码

indexer.go 1.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package meilisearch
  4. import (
  5. "context"
  6. "errors"
  7. "fmt"
  8. "github.com/meilisearch/meilisearch-go"
  9. )
  10. // Indexer represents a basic meilisearch indexer implementation
  11. type Indexer struct {
  12. Client meilisearch.ServiceManager
  13. url, apiKey string
  14. indexName string
  15. version int
  16. settings *meilisearch.Settings
  17. }
  18. func NewIndexer(url, apiKey, indexName string, version int, settings *meilisearch.Settings) *Indexer {
  19. return &Indexer{
  20. url: url,
  21. apiKey: apiKey,
  22. indexName: indexName,
  23. version: version,
  24. settings: settings,
  25. }
  26. }
  27. // Init initializes the indexer
  28. func (i *Indexer) Init(_ context.Context) (bool, error) {
  29. if i == nil {
  30. return false, errors.New("cannot init nil indexer")
  31. }
  32. if i.Client != nil {
  33. return false, errors.New("indexer is already initialized")
  34. }
  35. i.Client = meilisearch.New(i.url, meilisearch.WithAPIKey(i.apiKey))
  36. _, err := i.Client.GetIndex(i.VersionedIndexName())
  37. if err == nil {
  38. return true, nil
  39. }
  40. _, err = i.Client.CreateIndex(&meilisearch.IndexConfig{
  41. Uid: i.VersionedIndexName(),
  42. PrimaryKey: "id",
  43. })
  44. if err != nil {
  45. return false, err
  46. }
  47. i.checkOldIndexes()
  48. _, err = i.Client.Index(i.VersionedIndexName()).UpdateSettings(i.settings)
  49. return false, err
  50. }
  51. // Ping checks if the indexer is available
  52. func (i *Indexer) Ping(ctx context.Context) error {
  53. if i == nil {
  54. return errors.New("cannot ping nil indexer")
  55. }
  56. if i.Client == nil {
  57. return errors.New("indexer is not initialized")
  58. }
  59. resp, err := i.Client.Health()
  60. if err != nil {
  61. return err
  62. }
  63. if resp.Status != "available" {
  64. // See https://docs.meilisearch.com/reference/api/health.html#status
  65. return fmt.Errorf("status of meilisearch is not available: %s", resp.Status)
  66. }
  67. return nil
  68. }
  69. // Close closes the indexer
  70. func (i *Indexer) Close() {
  71. if i == nil {
  72. return
  73. }
  74. i.Client = nil
  75. }