diff --git a/main.go b/main.go index d8af25ad..9b19b4a3 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "github.com/animenotifier/notify.moe/auth" "github.com/animenotifier/notify.moe/middleware" "github.com/animenotifier/notify.moe/pages" + "github.com/animenotifier/notify.moe/utils/routetests" ) var app = aero.New() @@ -73,7 +74,7 @@ func configure(app *aero.Application) *aero.Application { }) // Specify test routes - for route, examples := range routeTests { + for route, examples := range routetests.All() { app.Test(route, examples) } diff --git a/main_test.go b/main_test.go index 45260e9d..a29b7ae7 100644 --- a/main_test.go +++ b/main_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/aerogo/aero" + "github.com/animenotifier/notify.moe/utils/routetests" ) // TestRouteStatusCodes tests the status code of every route registered in routeTests. @@ -14,7 +15,7 @@ func TestRouteStatusCodes(t *testing.T) { app := configure(aero.New()) // Iterate through every route - for _, examples := range routeTests { + for _, examples := range routetests.All() { // Iterate through every example specified for that route for _, example := range examples { // Create a new HTTP request diff --git a/pages/apiview/apidocs/apidocs.go b/pages/apiview/apidocs/apidocs.go index 5d3ccdfb..ba4b1630 100644 --- a/pages/apiview/apidocs/apidocs.go +++ b/pages/apiview/apidocs/apidocs.go @@ -2,12 +2,14 @@ package apidocs import ( "reflect" + "strings" "unicode" "github.com/aerogo/aero" "github.com/animenotifier/arn" "github.com/animenotifier/notify.moe/components" "github.com/animenotifier/notify.moe/utils" + "github.com/animenotifier/notify.moe/utils/routetests" ) // ByType renders the api docs page for the given type. @@ -16,39 +18,44 @@ func ByType(typeName string) func(*aero.Context) string { t := arn.API.Type(typeName) fields := []*utils.APIField{} - for i := 0; i < t.NumField(); i++ { - field := t.Field(i) + if t.Kind() == reflect.Struct { + for i := 0; i < t.NumField(); i++ { + field := t.Field(i) - if field.Anonymous || !unicode.IsUpper(rune(field.Name[0])) { - continue - } - - typeName := "" - - switch field.Type.Kind() { - case reflect.Ptr: - typeName = field.Type.Elem().Name() - - case reflect.Slice: - sliceElementType := field.Type.Elem() - - if sliceElementType.Kind() == reflect.Ptr { - sliceElementType = sliceElementType.Elem() + if field.Anonymous || !unicode.IsUpper(rune(field.Name[0])) { + continue } - typeName = sliceElementType.Name() + "[]" + typeName := "" - default: - typeName = field.Type.Name() + switch field.Type.Kind() { + case reflect.Ptr: + typeName = field.Type.Elem().Name() + + case reflect.Slice: + sliceElementType := field.Type.Elem() + + if sliceElementType.Kind() == reflect.Ptr { + sliceElementType = sliceElementType.Elem() + } + + typeName = sliceElementType.Name() + "[]" + + default: + typeName = field.Type.Name() + } + + fields = append(fields, &utils.APIField{ + Name: field.Name, + JSON: field.Tag.Get("json"), + Type: typeName, + }) } - - fields = append(fields, &utils.APIField{ - Name: field.Name, - JSON: field.Tag.Get("json"), - Type: typeName, - }) } - return ctx.HTML(components.APIDocs(t, fields)) + route := "/api/" + strings.ToLower(typeName) + "/:id" + examples := routetests.All()[route] + + return ctx.HTML(components.APIDocs(t, examples, fields)) } } diff --git a/pages/apiview/apidocs/apidocs.pixy b/pages/apiview/apidocs/apidocs.pixy index 9829d846..fc402671 100644 --- a/pages/apiview/apidocs/apidocs.pixy +++ b/pages/apiview/apidocs/apidocs.pixy @@ -1,21 +1,32 @@ -component APIDocs(t reflect.Type, fields []*utils.APIField) - h1= "API: " + t.Name() +component APIDocs(t reflect.Type, examples []string, fields []*utils.APIField) + .api-docs-page + h1= "API: " + t.Name() - table - thead - tr - th Field name - th JavaScript notation - th Type - tbody - each field in fields + h2 Examples + + if len(examples) == 0 + p.no-data No examples have been added to this type yet. + else + .buttons + each example in examples + a.button(href="https://notify.moe" + example, target="_blank") + Icon("external-link") + span= example + + h2 Fields + + table + thead tr - td= field.Name - td= field.JSON - td= field.Type - + th Field + th Type + tbody + each field in fields + tr.api-field + td.api-field-json(title=field.Name + " (Go)")= field.JSON + td.api-field-type= field.Type - .corner-buttons - a.button(href="/api") - Icon("code") - span Overview \ No newline at end of file + .corner-buttons + a.button(href="/api") + Icon("code") + span Overview \ No newline at end of file diff --git a/pages/apiview/apidocs/apidocs.scarlet b/pages/apiview/apidocs/apidocs.scarlet new file mode 100644 index 00000000..5e7c4ada --- /dev/null +++ b/pages/apiview/apidocs/apidocs.scarlet @@ -0,0 +1,19 @@ +.api-docs-page + h1, + h2 + text-align left + + table + margin 0 + + .buttons + justify-content flex-start + +.api-field + // + +.api-field-json + // + +.api-field-type + opacity 0.5 \ No newline at end of file diff --git a/styles/headers.scarlet b/styles/headers.scarlet index 8dd648f6..e3d5bdf0 100644 --- a/styles/headers.scarlet +++ b/styles/headers.scarlet @@ -1,9 +1,15 @@ -h1, h2 +h1 font-size 2em font-weight bold text-align center line-height 1.3em +h2 + font-size 1.6em + line-height 1.3em + font-weight bold + text-align center + h3 font-size 1.5em line-height 1.6em diff --git a/tests.go b/utils/routetests/All.go similarity index 98% rename from tests.go rename to utils/routetests/All.go index b76ca620..ceca6b80 100644 --- a/tests.go +++ b/utils/routetests/All.go @@ -1,4 +1,4 @@ -package main +package routetests var routeTests = map[string][]string{ // User @@ -364,3 +364,8 @@ var routeTests = map[string][]string{ "/inventory": nil, "/extension/embed": nil, } + +// All returns which specific routes to test for a given generic route. +func All() map[string][]string { + return routeTests +}