{"id":27299862,"url":"https://github.com/clavoie/ae","last_synced_at":"2025-04-12T00:49:50.447Z","repository":{"id":73552499,"uuid":"147342078","full_name":"clavoie/ae","owner":"clavoie","description":"Injectable Google AppEngine wrappers for Go.","archived":false,"fork":false,"pushed_at":"2018-09-07T11:36:03.000Z","size":18,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-12T00:49:43.409Z","etag":null,"topics":["appengine-go","dependency-injection","go","golang"],"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/clavoie.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-09-04T12:25:00.000Z","updated_at":"2018-09-07T11:36:26.000Z","dependencies_parsed_at":"2023-02-25T15:45:29.244Z","dependency_job_id":null,"html_url":"https://github.com/clavoie/ae","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clavoie%2Fae","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clavoie%2Fae/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clavoie%2Fae/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clavoie%2Fae/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/clavoie","download_url":"https://codeload.github.com/clavoie/ae/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248501911,"owners_count":21114681,"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":["appengine-go","dependency-injection","go","golang"],"created_at":"2025-04-12T00:49:49.874Z","updated_at":"2025-04-12T00:49:50.438Z","avatar_url":"https://github.com/clavoie.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ae [![GoDoc](https://godoc.org/github.com/clavoie/ae?status.svg)](http://godoc.org/github.com/clavoie/ae) [![Build Status](https://travis-ci.org/clavoie/ae.svg?branch=master)](https://travis-ci.org/clavoie/ae) [![Go Report Card](https://goreportcard.com/badge/github.com/clavoie/ae)](https://goreportcard.com/report/github.com/clavoie/ae)\n\nWrappers around Google's AppEngine Go packages, meant for use with a dependency injection system and unit tests. Currently only the `appengine`, `datastore`, and `taskqueue` pakcages are wrapped.\n\n## Usage\n\nThe wrapper interfaces aim to keep the names, parameter types, and parameter orders the same as the functions of the packages they wrap. Using the wrappers should consist of setting up your dependency injection system and then using the wrappers as you would the package functions directly.\n\nOne major advantage of using this package with a dependency injection system is you no longer have to keep track of the `r *http.Request` or `c context.Context` as those are injected into the dependency wrappers.\n\n```go\nfnuc MyHandler(app ae.AppEngine, db ae.Db, log logu.Logger) {\n  // wraps the appengine package\n  if app.ModuleName() != \"address\" {\n    return;\n  }\n  \n  // wraps the datastore package\n  q := db.NewQuery(\"Address\")\n  q = q.Filter(\"Street =\", someValue).KeysOnly()\n  addresses := make([]Address, 0)\n  keys, err := q.GetAll(addresses)\n  \n  if err != nil {\n    log.Errorf(\"Could not get addresses: %v\", err)\n    return\n  }\n  \n  // etc\n} \n```\n## Setup\n\nBelow is a more complete example of how the main.go file would be set up for an App Engine service:\n\n```go\npackage main\n\nimport (\n  \"myPackage\"\n  \"net/http\"\n\n  \"github.com/clavoie/di\"\n  \"github.com/clavoie/erru\"\n  \"github.com/clavoie/logu\"\n)\n\nvar httpResolver di.IHttpResolver\n\nfunc onResolveErr(err *di.ErrResolve, w http.ResponseWriter, r *http.Request) {\n  logger := logu.NewAppEngineLogger(r)\n  logger.Errorf(\"err encountered while resolving dependencies: %v\", err.String())\n\n  httpErr, isHttpErr := err.Err.(erru.HttpErr)\n  if isHttpErr {\n    w.WriteHeader(httpErr.StatusCode())\n  } else {\n    w.WriteHeader(http.StatusInternalServerError)\n  }\n}\n\nvar httpDefs = []*di.HttpDef{\n  {myPackage.HomeHandler, \"/\"},\n  {myPackage.AddressHandler, \"/address\"},\n  // etc...\n}\n\nfunc init() {\n  var err error\n\n  httpResolver, err = di.NewResolver(onResolveErr, \n    ae.NewDiDefs(), \n    logu.NewAppEngineDiDefs(),\n    myPackage.NewDiDefs(),\n    // etc, your service deps here\n    )\n\n  if err != nil {\n    panic(err)\n  }\n\n  err = httpResolver.SetDefaultServeMux(httpDefs)\n  \n  if err != nil {\n    panic(err)\n  }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclavoie%2Fae","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclavoie%2Fae","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclavoie%2Fae/lists"}