{"id":20017614,"url":"https://github.com/foomo/redirects","last_synced_at":"2025-03-02T03:16:33.319Z","repository":{"id":196026322,"uuid":"693150774","full_name":"foomo/redirects","owner":"foomo","description":null,"archived":false,"fork":false,"pushed_at":"2023-09-21T19:33:34.000Z","size":24,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":9,"default_branch":"main","last_synced_at":"2023-09-22T03:34:04.871Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/foomo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-09-18T13:00:54.000Z","updated_at":"2024-06-21T12:00:09.296Z","dependencies_parsed_at":"2023-09-24T16:31:43.552Z","dependency_job_id":null,"html_url":"https://github.com/foomo/redirects","commit_stats":null,"previous_names":["foomo/redirects"],"tags_count":27,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foomo%2Fredirects","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foomo%2Fredirects/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foomo%2Fredirects/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foomo%2Fredirects/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/foomo","download_url":"https://codeload.github.com/foomo/redirects/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241451677,"owners_count":19964901,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-13T08:16:56.563Z","updated_at":"2025-03-02T03:16:33.295Z","avatar_url":"https://github.com/foomo.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# redirects\n\n[![GoDoc](https://godoc.org/github.com/foomo/go?status.svg)](https://godoc.org/github.com/foomo/go)\n[![Go Report Card](https://goreportcard.com/badge/github.com/foomo/redirects)](https://goreportcard.com/report/github.com/foomo/redirects)\n[![Tests](https://github.com/foomo/redirects/actions/workflows/test.yml/badge.svg)](https://github.com/foomo/redirects/actions/workflows/test.yml)\n\n\n## Introduction and Goals\n\nFramework to kickstart automatic redirects.\n\n## System Scope and Context\n\n```mermaid\ngraph TB\n    cse[Contentserverexport\\nsite/Contentserverexport]\n    ns[Nats server]\n    gw[Gateway\\nsite/gateway]\n    db[(Redirects MongoDB)]\n    fr(Redirect frontend) -- Interacts with --\u003e interface\n    cms(CMS) -- send update signal --\u003e cse\n    cse -- push old and new content server data --\u003e create\n\n    subgraph Redirects site/redirects\n        interface[[Redirects interface]] --\u003e CRUD\n        subgraph CRUD\n            save[[\u003cb\u003eSave new redirects\u003c/b\u003e\\nConsolidate new redirects with existing]]\n            create[[\u003cb\u003eCreateRedirectsBasedOnContentserverData\u003c/b\u003e\\nCreate redirects based on old/new comparison]]\n            gr[[Get redirects]]\n        end\n        create -- push new redirects --\u003e save\n\n    end\n    save --Send update signal --\u003e ns\n    save -- upsert new redirects --\u003e db\n    save -- pull current redirects --\u003e db\n    gr -- pull current redirects --\u003e db\n    ns -- listens to update signal --\u003e gw\n    gw -- pull new redirects --\u003e gr\n```\n\n### Service Endpoints\n\nThe redirects service provides an API that the frontend and the site-gateway services can use to manipulate redirects.\n\n#### Internal\n\n  ##### CreateRedirectsFromContentserverexport\n\n  ```go\n  func (rs *Service) CreateRedirectsFromContentserverexport(\n    _ http.ResponseWriter,\n    r *http.Request,\n    old,\n    new map[string]*content.RepoNode,\n  ) error\n  ```\n  Creates redirects from contentserverexport based on old/new state comparison.\n\n  ##### GetRedirects\n\n  ```go\n  func (rs *Service) GetRedirects(_ http.ResponseWriter, r *http.Request) (map[redirectstore.Dimension]map[redirectstore.RedirectSource]*redirectstore.RedirectDefinition, error)\n  ```\n  Returns all redirects.\n\n#### Public (used by frontend)\n\n  ##### Search\n\n  ```go\n  func (rs *Service) Search(_ http.ResponseWriter, r *http.Request, locale, path string) (map[redirectstore.RedirectSource]*redirectstore.RedirectDefinition, *redirectstore.RedirectDefinitionError)\n  ```\n  Search for a redirect.\n\n  ##### Create\n\n  ```go\n  func (rs *Service) Create(_ http.ResponseWriter, r *http.Request, def *redirectstore.RedirectDefinition, locale string) (redirectstore.EntityID, *redirectstore.RedirectDefinitionError)\n  ```\n  Create a redirect.\n\n  ##### Delete\n\n  ```go\n  func (rs *Service) Delete(_ http.ResponseWriter, r *http.Request, id string) *redirectstore.RedirectDefinitionError\n  ```\n  Delete a redirect.\n\n  ##### Update\n\n  ```go\n  func (rs *Service) Update(_ http.ResponseWriter, r *http.Request, def *redirectstore.RedirectDefinition) *redirectstore.RedirectDefinitionError\n  ```\n  Update a redirect.\n\n## Usage\n\n```go\nimport (\n\tkeelmongo \"github.com/foomo/keel/persistence/mongo\"\n\tkeelservice \"github.com/foomo/keel/service\"\n\t\"github.com/foomo/redirects/domain/redirectdefinition\"\n\tredirectrepository \"github.com/foomo/redirects/domain/redirectdefinition/repository\"\n\tredirectservice \"github.com/foomo/redirects/domain/redirectdefinition/service\"\n\tredirectnats \"github.com/foomo/redirects/pkg/nats\"\n)\n\npersistor, err := keelmongo.New(ctx, pkgconfig.GetDefaultMongoURI(c, \"database_name\")())\nlog.Must(l, err, \"could not create mongo persistor\")\n\nrepo, err := redirectrepository.NewBaseRedirectsDefinitionRepository(l, persistor)\nlog.Must(l, err, \"could not create redirect repository\")\n\nupdateSignal, err := redirectnats.NewUpdateSignal(\n  ctx,\n  l,\n  pkgconfig.GetLocalNatsServer(c)(),\n  \"site-redirects\",\n  redirectnats.DefaultNatsTopic().String(),\n)\nlog.Must(l, err, \"failed to create update signal\")\n\napi, err := redirectdefinition.NewAPI(l, repo, updateSignal, redirectdefinition.WithSiteIdentifierProvider(redirects.GetSiteIdentifierProviderFunc()))\nlog.Must(l, err, \"could not create redirect api\")\n\nservice := redirectdefinition.NewService(\n  l,\n  api,\n  redirectdefinition.WithEnabledFunc(\n    pkgconfig.GetClusterFleetBool(c, \"enabled\", true),\n  ),\n)\n\n// add services\nsvr.AddServices(\n  // add public site service\n  keelservice.NewHTTP(l, \"redirects-admin\", \":8080\",\n    redirectservice.NewDefaultAdminServiceGoTSRPCProxy(service),\n    keelgotsrpcmiddleware.Telemetry(),\n    middleware.Telemetry(),\n    middleware.Logger(),\n    session.SessionIDMiddleware(sessionDomains(), false, pkgconfig.GetDefaultDomainProviderOptions()),\n    middleware.RequestID(),\n    middleware.Recover(),\n  ),\n  keelservice.NewHTTP(l, \"redirects-internal\", \":8081\",\n    redirectservice.NewDefaultInternalServiceGoTSRPCProxy(service),\n    keelgotsrpcmiddleware.Telemetry(),\n    middleware.Telemetry(),\n    middleware.Logger(),\n    session.SessionIDMiddleware(sessionDomains(), false, pkgconfig.GetDefaultDomainProviderOptions()),\n    middleware.RequestID(),\n    middleware.Recover(),\n  ),\n)\n\n```\n\n## License\n\nDistributed under MIT License, please see license file within the code for more details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoomo%2Fredirects","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffoomo%2Fredirects","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoomo%2Fredirects/lists"}