Skip to content

doujins-org/ginapi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ginapi

Shared Gin utilities for building consistent REST APIs across multiple Go projects.

Why?

When you have multiple services (doujins, hentai0, etc.) that need consistent API behavior, this library provides:

  • Response formatting - Stripe-style JSON envelopes so all APIs return the same structure
  • Pagination - Offset/limit binding with sensible defaults
  • Language detection - Middleware that detects user language from query params, URL path, cookies, or Accept-Language headers
  • Language redirects - Helpers for routes without a language prefix (e.g., /galleries) that need to 302 redirect to a concrete language (e.g., /en/galleries) based on user preference

Instead of copy-pasting this boilerplate into each project, import it once.

Install

go get github.com/doujins-org/ginapi

Response Format

{"object": "artist", "id": "123", "name": "..."}

{"object": "list", "data": [...], "total": 100, "limit": 20, "offset": 0, "has_more": true}

{"object": "error", "error": {"type": "not_found_error", "message": "..."}}

Pagination

params := pagination.BindDefault(c)  // ?limit=20&offset=0
response.ListResponse(c, items, total, params.Limit, params.Offset)

Language Middleware

Detects language from: query param → URL path → cookie → Accept-Language → default.

router.Use(middleware.Language(middleware.LanguageConfig{
    Supported: []string{"en", "ja", "ko"},
    Default:   "en",
}))

lang := middleware.GetLanguage(c)

Language Redirect (NoRoute)

Redirects /galleries/en/galleries based on user preference.

r.NoRoute(func(c *gin.Context) {
    if middleware.HandleLanguageRedirect(c, middleware.LanguageRedirectConfig{
        Supported: []string{"en", "ja", "ko"},
        Default:   "en",
    }) {
        return
    }
    serveIndexHTML(c)
})

Reference

Function Description
GetLanguage(c) Get detected language from gin context
LanguageFromContext(ctx) Get language from request context
SetLanguageCookie(c, lang) Set 1-year language cookie
ExtractLanguageFromPath(path) Extract lang prefix from URL
ParseAcceptLanguage(header, supported) Parse Accept-Language header

About

Simple response helpers, pagination structure, and language-routing middleware for Gin.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages