syntax = "v1"

@server (
	group: base
)
service test {
	@handler root
	get /

	@handler ping
	get /ping

	@handler postRoot
	post /

	@handler postPing
	post /ping
}

type (
	Subject {
		Id   int64  `json:"id"`
		Name string `json:"name"`
	}
	Grade {
		Id   int64  `json:"id"`
		Name string `json:"name"`
	}
	Class {
		Id       int64      `json:"id"`
		Name     string     `json:"name"`
		GradeId  int64      `json:"gradeId"`
		Teachers []*Teacher `json:"teachers"`
		Master {
			UserId int64 `json:"userId"`
			Temp   bool  `json:"temp"`
		} `json:"master"`
	}
	User {
		Id     int64    `json:"id"`
		Name   string   `json:"name"`
		Gender int      `json:"gender"`
		Active bool     `json:"active"`
		Hobby  []string `json:"hobby"`
	}
	Teacher {
		UserId    int64            `json:"userId"`
		Id        int64            `json:"id"`
		Name      string           `json:"name"`
		SubjectId int64            `json:"subjectId"`
		Class     map[int64]*Class `json:"class"`
	}
	Student {
		UserId      int64                  `json:"userId"`
		StudentId   int64                  `json:"studentId"`
		Number      string                 `json:"number"`
		ClassId     int64                  `json:"classId"`
		SubjectId   []int64                `json:"subjectId"`
		SubjectTop3 [3]int64               `json:"subjectTop3"`
		Extra       map[string]interface{} `json:"extra"`
	}
	Base {
		Code int64  `json:"code"`
		Msg  string `json:"msg"`
	}
)

type (
	LoginReq {
		Username string `json:"username"`
		Password string `json:"password"`
	}
	LoginResp {
		Base
		Data *User `json:"data"`
	}
)

@server (
	group:  user
	prefix: /user
)
service test {
	@handler login
	post /login (LoginReq) returns (LoginReq)
}

type (
	UserInfoReq {
		Id int64 `path:"id"`
	}
	UserInfoResp {
		Base
		Data *User `json:"data"`
	}
)

@server (
	group:      user
	prefix:     /user
	jwt:        JWT
	middleware: Auth
)
service test {
	@handler userInfo
	post /info/:id (UserInfoReq) returns (UserInfoResp)
}

type (
	StudentClassNameListReq {
		Id int64 `string:"id"`
	}
	StudentInfoReq {
		Id int64 `path:"id"`
	}
	SutdentInfoResp {
		Base
		Data *Student `json:"data"`
	}
	UpdateStudentInfoReq {
		UserId      int64                  `form:"userId"`
		StudentId   int64                  `form:"studentId"`
		Number      string                 `form:"number"`
		ClassId     int64                  `form:"classId"`
		SubjectId   []int64                `form:"subjectId"`
		SubjectTop3 [3]int64               `form:"subjectTop3"`
		Extra       map[string]interface{} `form:"extra"`
	}
	UpdateSutdentInfoResp {
		Base
		Data *Student `json:"data"`
	}
)

@server (
	group:      student
	prefix:     /student
	jwt:        JWT
	middleware: Auth
)
service test {
	@handler studentInfo
	get /info/:id (StudentInfoReq) returns (SutdentInfoResp)

	@handler updateStudentInfo
	post /info/update (UpdateStudentInfoReq) returns (UpdateSutdentInfoResp)

	@handler studentClassNameList
	post /class/name/list (StudentClassNameListReq) returns ([]string)
}

