add v0.1.0 generator
This commit is contained in:
parent
6184f11989
commit
bcbd88d728
|
@ -21,3 +21,4 @@
|
||||||
# Go workspace file
|
# Go workspace file
|
||||||
go.work
|
go.work
|
||||||
|
|
||||||
|
/swaggers
|
||||||
|
|
|
@ -0,0 +1,153 @@
|
||||||
|
package client
|
||||||
|
|
||||||
|
import io.micronaut.http.HttpResponse
|
||||||
|
import io.micronaut.http.annotation.*
|
||||||
|
import io.micronaut.http.client.annotation.Client
|
||||||
|
|
||||||
|
@Client(value = "INPUT URL")
|
||||||
|
interface GDSClient {
|
||||||
|
|
||||||
|
@Get(value = "/sales/dispatch/places")
|
||||||
|
fun getDispatchPlaces(
|
||||||
|
@Header authorization: String?,
|
||||||
|
): HttpResponse<List<PlaceAVS>>
|
||||||
|
|
||||||
|
@Post(value = "/sales/order/{orderId}/passenger")
|
||||||
|
fun addPassenger(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable orderId: Int,
|
||||||
|
): HttpResponse<TicketAVS>
|
||||||
|
|
||||||
|
@Put(value = "/sales/session/open")
|
||||||
|
fun openSession(
|
||||||
|
@Header authorization: String?,
|
||||||
|
): HttpResponse<SessionAVS>
|
||||||
|
|
||||||
|
@Get(value = "/sales/trip/{tripId}/document/types")
|
||||||
|
fun getDocumentTypes(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable tripId: Int,
|
||||||
|
): HttpResponse<List<DocTypeAVS>>
|
||||||
|
|
||||||
|
@Get(value = "/sales/arrival/places")
|
||||||
|
fun getArrivalPlaces(
|
||||||
|
@Header authorization: String?,
|
||||||
|
): HttpResponse<List<PlaceAVS>>
|
||||||
|
|
||||||
|
@Put(value = "/sales/order/tickets/{ticketId}/passenger")
|
||||||
|
fun updateTickerPassenger(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable ticketId: Int,
|
||||||
|
): HttpResponse<>
|
||||||
|
|
||||||
|
@Get(value = "/sales/order/{orderId}")
|
||||||
|
fun getOrder(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable orderId: Int,
|
||||||
|
): HttpResponse<OrderAVS>
|
||||||
|
|
||||||
|
@Delete(value = "/sales/order/{orderId}")
|
||||||
|
fun cancelOrder(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable orderId: Int,
|
||||||
|
): HttpResponse<OrderAVS>
|
||||||
|
|
||||||
|
@Post(value = "/sales/order/{orderId}/confirm/payment/by/{payForm}")
|
||||||
|
fun confirmPayment(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable orderId: Int,
|
||||||
|
@PathVariable payForm: String,
|
||||||
|
): HttpResponse<OrderAVS>
|
||||||
|
|
||||||
|
@Get(value = "/sales/ticket/series/{series}/number/{number}/return/calculation")
|
||||||
|
fun getReturnInfo(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable series: String,
|
||||||
|
@PathVariable number: String,
|
||||||
|
): HttpResponse<TicketAVS>
|
||||||
|
|
||||||
|
@Get(value = "/sales/trip/{tripId}/from/station/{dispatchStationId}/to/station/{arrivalStationId}/book/{ticketCount}")
|
||||||
|
fun bookOrder(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable tripId: String,
|
||||||
|
@PathVariable dispatchStationId: String,
|
||||||
|
@PathVariable arrivalStationId: String,
|
||||||
|
@PathVariable ticketCount: Int,
|
||||||
|
@PathVariable baggageCount: Int?,
|
||||||
|
): HttpResponse<OrderAVS>
|
||||||
|
|
||||||
|
@Get(value = "/settings")
|
||||||
|
fun getSettings(
|
||||||
|
): HttpResponse<Settings>
|
||||||
|
|
||||||
|
@Post(value = "/auth/token")
|
||||||
|
fun login(
|
||||||
|
): HttpResponse<AuthDTO>
|
||||||
|
|
||||||
|
@Get(value = "/kassa")
|
||||||
|
fun index(
|
||||||
|
): HttpResponse<>
|
||||||
|
|
||||||
|
@Get(value = "/sales/dispatch/place/{placeId}/stations")
|
||||||
|
fun getDispatchStations(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable placeId: Int,
|
||||||
|
): HttpResponse<List<StationAVS>>
|
||||||
|
|
||||||
|
@Post(value = "/sales/order/{orderId}/baggage")
|
||||||
|
fun addBaggage(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable orderId: Int,
|
||||||
|
): HttpResponse<TicketAVS>
|
||||||
|
|
||||||
|
@Put(value = "/sales/session/close")
|
||||||
|
fun closeSession(
|
||||||
|
@Header authorization: String?,
|
||||||
|
): HttpResponse<SessionAVS>
|
||||||
|
|
||||||
|
@Get(value = "/sales/trip/{tripId}/from/{dispatchStationId}/to/{arrivalStationId}/seats/free")
|
||||||
|
fun getSeatsFree(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable tripId: Int,
|
||||||
|
@PathVariable dispatchStationId: Int,
|
||||||
|
@PathVariable arrivalStationId: Int,
|
||||||
|
): HttpResponse<List<>>
|
||||||
|
|
||||||
|
@Get(value = "/sales/trip/{tripId}/ticket/types")
|
||||||
|
fun getTicketTypes(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable tripId: String,
|
||||||
|
): HttpResponse<List<TicketTypeAVS>>
|
||||||
|
|
||||||
|
@Get(value = "/countries")
|
||||||
|
fun getCountries(
|
||||||
|
): HttpResponse<List<CountryCode>>
|
||||||
|
|
||||||
|
@Get(value = "/sales/arrival/place/{placeId}/stations")
|
||||||
|
fun getArrivalStations(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable placeId: Int,
|
||||||
|
): HttpResponse<List<StationAVS>>
|
||||||
|
|
||||||
|
@Get(value = "/sales/dispatch/station/{dispatchStationId}/arrival/place/{arrivalPlaceId}/{date}/trips")
|
||||||
|
fun getTrips(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable dispatchStationId: Int,
|
||||||
|
@PathVariable arrivalPlaceId: Int,
|
||||||
|
@PathVariable date: String,
|
||||||
|
): HttpResponse<List<TripKassa>>
|
||||||
|
|
||||||
|
@Delete(value = "/sales/order/tickets/{ticketId}")
|
||||||
|
fun cancelTicket(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable ticketId: Int,
|
||||||
|
): HttpResponse<TicketAVS>
|
||||||
|
|
||||||
|
@Post(value = "/sales/ticket/{ticketId}/return")
|
||||||
|
fun returnTicket(
|
||||||
|
@Header authorization: String?,
|
||||||
|
@PathVariable ticketId: Int,
|
||||||
|
): HttpResponse<TicketAVS>
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,191 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type config struct {
|
||||||
|
Openapi string `json:"openapi"`
|
||||||
|
Info struct {
|
||||||
|
Title string `json:"title"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
Version string `json:"version"`
|
||||||
|
} `json:"info"`
|
||||||
|
Paths map[string]map[string]struct {
|
||||||
|
Tags []string `json:"tags"`
|
||||||
|
Summary string `json:"summary"`
|
||||||
|
OperationID string `json:"operationId"`
|
||||||
|
Parameters []struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
In string `json:"in"`
|
||||||
|
Schema property `json:"schema"`
|
||||||
|
} `json:"parameters"`
|
||||||
|
RequestBody *struct {
|
||||||
|
Content struct {
|
||||||
|
ApplicationJSON struct {
|
||||||
|
Schema property `json:"schema"`
|
||||||
|
} `json:"application/json"`
|
||||||
|
} `json:"content"`
|
||||||
|
Required bool `json:"required"`
|
||||||
|
} `json:"requestBody"`
|
||||||
|
Responses struct {
|
||||||
|
Num200 struct {
|
||||||
|
Description string `json:"description"`
|
||||||
|
Content struct {
|
||||||
|
ApplicationJSON struct {
|
||||||
|
Schema property `json:"schema"`
|
||||||
|
} `json:"application/json"`
|
||||||
|
} `json:"content"`
|
||||||
|
} `json:"200"`
|
||||||
|
} `json:"responses"`
|
||||||
|
} `json:"paths"`
|
||||||
|
Components struct {
|
||||||
|
Models map[string]struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Properties map[string]property `json:"properties"`
|
||||||
|
} `json:"schemas"`
|
||||||
|
} `json:"components"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type property struct {
|
||||||
|
Type string `json:"type"`
|
||||||
|
Format string `json:"format"`
|
||||||
|
Nullable bool `json:"nullable"`
|
||||||
|
Ref string `json:"$ref"`
|
||||||
|
AllOf []struct {
|
||||||
|
Ref string `json:"$ref"`
|
||||||
|
} `json:"allOf"`
|
||||||
|
Items struct {
|
||||||
|
Ref string `json:"$ref"`
|
||||||
|
} `json:"items"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *property) toKt() string {
|
||||||
|
sb := strings.Builder{}
|
||||||
|
if p.Type != "" {
|
||||||
|
sb.WriteString(fmt.Sprintf("%s", toMicronautKotlinType(*p)))
|
||||||
|
}
|
||||||
|
if p.Ref != "" {
|
||||||
|
sb.WriteString(fmt.Sprintf("%s", refToName(p.Ref)))
|
||||||
|
}
|
||||||
|
if len(p.AllOf) != 0 {
|
||||||
|
sb.WriteString(fmt.Sprintf("%s", refToName(p.AllOf[0].Ref)))
|
||||||
|
}
|
||||||
|
if p.Nullable {
|
||||||
|
sb.WriteString(fmt.Sprintf("?"))
|
||||||
|
}
|
||||||
|
return sb.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
b, err := os.ReadFile("swaggers/example_1.json")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
config := &config{}
|
||||||
|
if err := json.Unmarshal(b, config); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
res := toMicronautKotlin(config)
|
||||||
|
|
||||||
|
if err := os.WriteFile("models.kt", []byte(res["models"]), 0600); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.WriteFile("client.kt", []byte(res["client"]), 0600); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func toMicronautKotlin(config *config) map[string]string {
|
||||||
|
sbModels := strings.Builder{}
|
||||||
|
sbModels.WriteString("package models\n\n")
|
||||||
|
for modelName, model := range config.Components.Models {
|
||||||
|
sbModels.WriteString(fmt.Sprintf("data class %s(\n", modelName))
|
||||||
|
for name, value := range model.Properties {
|
||||||
|
sbModels.WriteString(fmt.Sprintf("\tvar %s: ", name))
|
||||||
|
sbModels.WriteString(value.toKt())
|
||||||
|
sbModels.WriteString(",\n")
|
||||||
|
}
|
||||||
|
sbModels.WriteString(")\n\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
sbClient := strings.Builder{}
|
||||||
|
sbClient.WriteString("package client\n\n")
|
||||||
|
sbClient.WriteString("import io.micronaut.http.HttpResponse\n")
|
||||||
|
sbClient.WriteString("import io.micronaut.http.annotation.*\n")
|
||||||
|
sbClient.WriteString("import io.micronaut.http.client.annotation.Client\n")
|
||||||
|
sbClient.WriteString("\n")
|
||||||
|
sbClient.WriteString("@Client(value = \"INPUT URL\")\n")
|
||||||
|
sbClient.WriteString("interface GDSClient {\n\n")
|
||||||
|
for path, methods := range config.Paths {
|
||||||
|
for method, v := range methods {
|
||||||
|
sbClient.WriteString(fmt.Sprintf("\t@%s(value = \"%s\")\n", toMicronautKotlinMethod(method), path))
|
||||||
|
sbClient.WriteString(fmt.Sprintf("\tfun %s(\n", v.OperationID))
|
||||||
|
|
||||||
|
for _, p := range v.Parameters {
|
||||||
|
sbClient.WriteString("\t\t")
|
||||||
|
switch p.In {
|
||||||
|
case "header":
|
||||||
|
sbClient.WriteString("@Header")
|
||||||
|
case "path":
|
||||||
|
sbClient.WriteString("@PathVariable")
|
||||||
|
default:
|
||||||
|
sbClient.WriteString(fmt.Sprintf("(type %s not support)", p.In))
|
||||||
|
}
|
||||||
|
sbClient.WriteString(fmt.Sprintf(" %s: %s,\n", p.Name, p.Schema.toKt()))
|
||||||
|
}
|
||||||
|
|
||||||
|
// todo body and test
|
||||||
|
|
||||||
|
sbClient.WriteString("\t")
|
||||||
|
sbClient.WriteString(fmt.Sprintf("): HttpResponse<%s>\n", v.Responses.Num200.Content.ApplicationJSON.Schema.toKt()))
|
||||||
|
sbClient.WriteString("\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sbClient.WriteString("}\n\n")
|
||||||
|
|
||||||
|
return map[string]string{
|
||||||
|
"models": sbModels.String(),
|
||||||
|
"client": sbClient.String(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func toMicronautKotlinType(prop property) string {
|
||||||
|
switch prop.Type {
|
||||||
|
case "string":
|
||||||
|
return "String"
|
||||||
|
case "integer":
|
||||||
|
return "Int"
|
||||||
|
case "boolean":
|
||||||
|
return "Boolean"
|
||||||
|
case "number":
|
||||||
|
return "Double"
|
||||||
|
case "array":
|
||||||
|
return fmt.Sprintf("List<%s>", refToName(prop.Items.Ref))
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("type %s not support", prop.Type)
|
||||||
|
}
|
||||||
|
|
||||||
|
func toMicronautKotlinMethod(method string) string {
|
||||||
|
switch method {
|
||||||
|
case "get":
|
||||||
|
return "Get"
|
||||||
|
case "post":
|
||||||
|
return "Post"
|
||||||
|
case "put":
|
||||||
|
return "Put"
|
||||||
|
case "delete":
|
||||||
|
return "Delete"
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("mmethod %s not support", method)
|
||||||
|
}
|
||||||
|
|
||||||
|
func refToName(ref string) string {
|
||||||
|
arr := strings.Split(ref, "/")
|
||||||
|
return arr[len(arr)-1]
|
||||||
|
}
|
|
@ -0,0 +1,202 @@
|
||||||
|
package models
|
||||||
|
|
||||||
|
data class CountryAVS(
|
||||||
|
var id: String?,
|
||||||
|
var name: String?,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class IdentifierDocumentAVS(
|
||||||
|
var number: String,
|
||||||
|
var series: String?,
|
||||||
|
var type: DocTypeAVS,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class SessionAVS(
|
||||||
|
var id: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class RegionAVS(
|
||||||
|
var name: String?,
|
||||||
|
var type: String?,
|
||||||
|
var country: CountryAVS?,
|
||||||
|
var id: String?,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class Settings(
|
||||||
|
var defaultPlaceId: String,
|
||||||
|
var defaultStationId: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class AreaAVS(
|
||||||
|
var name: String?,
|
||||||
|
var type: String?,
|
||||||
|
var id: String?,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class AuthRequest(
|
||||||
|
var username: String,
|
||||||
|
var password: String,
|
||||||
|
var ws: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class PassengerAVS(
|
||||||
|
var passenger: PassengerPartPassengerAVS,
|
||||||
|
var identifierDocument: IdentifierDocumentAVS,
|
||||||
|
var benefitDocument: BenefitDocumentAVS?,
|
||||||
|
var categoryId: Int,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class PassengerPartPassengerAVS(
|
||||||
|
var citizenship: CitizenshipAVS,
|
||||||
|
var docNum: String?,
|
||||||
|
var docSeries: String?,
|
||||||
|
var docTypeId: String?,
|
||||||
|
var gender: String,
|
||||||
|
var birthDate: String?,
|
||||||
|
var id: Int?,
|
||||||
|
var lastName: String,
|
||||||
|
var middleName: String?,
|
||||||
|
var phone: String?,
|
||||||
|
var firstName: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class TicketCategoryAVS(
|
||||||
|
var requiredDocTypes: List<DocumentTypeAVS>?,
|
||||||
|
var id: String,
|
||||||
|
var name: String,
|
||||||
|
var price: Double,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class TicketTypeAVS(
|
||||||
|
var id: String,
|
||||||
|
var name: String,
|
||||||
|
var requiredDocTypes: List<RequiredDocTypeAVS>?,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class PlaceAVS(
|
||||||
|
var region: RegionAVS?,
|
||||||
|
var area: AreaAVS?,
|
||||||
|
var id: String?,
|
||||||
|
var name: String?,
|
||||||
|
var type: String?,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class StationAVS(
|
||||||
|
var id: String?,
|
||||||
|
var name: String?,
|
||||||
|
var shortName: String?,
|
||||||
|
var address: String?,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class BusSeatAVS(
|
||||||
|
var id: String,
|
||||||
|
var name: String,
|
||||||
|
var num: Int,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class DeparturesKassa(
|
||||||
|
var arrivals: List<ArrivalsAVS>,
|
||||||
|
var place: PlaceAVS?,
|
||||||
|
var station: StationAVS?,
|
||||||
|
var time: String?,
|
||||||
|
var tripId: String?,
|
||||||
|
var priceText: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class DocTypeAVS(
|
||||||
|
var id: String,
|
||||||
|
var name: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class AuthDTO(
|
||||||
|
var token: String?,
|
||||||
|
var refreshToken: String?,
|
||||||
|
var expireAt: Int?,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class OrderAVS(
|
||||||
|
var orderId: Int,
|
||||||
|
var tickets: List<TicketAVS>,
|
||||||
|
var expirationTime: String?,
|
||||||
|
var confirmError: String?,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class CitizenshipAVS(
|
||||||
|
var id: String,
|
||||||
|
var name: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class CountryCode(
|
||||||
|
var name: String,
|
||||||
|
var code: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class RequiredDocTypeAVS(
|
||||||
|
var id: String,
|
||||||
|
var name: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class TicketAVS(
|
||||||
|
var category: TicketCategoryAVS?,
|
||||||
|
var number: String?,
|
||||||
|
var passenger: PassengerPartPassengerAVS?,
|
||||||
|
var seat: BusSeatAVS?,
|
||||||
|
var series: String?,
|
||||||
|
var ticketClass: String,
|
||||||
|
var benefitDocument: BenefitDocumentAVS?,
|
||||||
|
var id: String,
|
||||||
|
var identifierDocument: IdentifierDocumentAVS?,
|
||||||
|
var payments: List<TicketPaymentAVS>?,
|
||||||
|
var status: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class TripKassa(
|
||||||
|
var bus: BusAVS?,
|
||||||
|
var seatsText: String,
|
||||||
|
var carrier: CarrierAVS?,
|
||||||
|
var changeSeatAllow: Boolean?,
|
||||||
|
var departures: List<DeparturesKassa>,
|
||||||
|
var name: String?,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class BenefitDocumentAVS(
|
||||||
|
var issuer: String?,
|
||||||
|
var number: String,
|
||||||
|
var series: String?,
|
||||||
|
var type: DocTypeAVS,
|
||||||
|
var beginDate: String?,
|
||||||
|
var endDate: String?,
|
||||||
|
var issueDate: String?,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class BusAVS(
|
||||||
|
var capacity: Int?,
|
||||||
|
var freeSeats: Int?,
|
||||||
|
var info: String?,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class CarrierAVS(
|
||||||
|
var inn: String?,
|
||||||
|
var name: String?,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class ArrivalsAVS(
|
||||||
|
var price: Int?,
|
||||||
|
var station: StationAVS?,
|
||||||
|
var time: String?,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class DocumentTypeAVS(
|
||||||
|
var id: String,
|
||||||
|
var name: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class TicketPaymentAVS(
|
||||||
|
var amount: Double,
|
||||||
|
var from: String?,
|
||||||
|
var group: String,
|
||||||
|
var id: String,
|
||||||
|
var name: String,
|
||||||
|
var nds: String,
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue