diff --git a/api/responses/responses.go b/api/responses/responses.go
index 8ad60d5fc..fe701dbf2 100644
--- a/api/responses/responses.go
+++ b/api/responses/responses.go
@@ -14,6 +14,7 @@ type Subsonic struct {
MusicFolders *MusicFolders `xml:"musicFolders,omitempty" json:"musicFolders,omitempty"`
Indexes *Indexes `xml:"indexes,omitempty" json:"indexes,omitempty"`
Directory *Directory `xml:"directory,omitempty" json:"directory,omitempty"`
+ User *User `xml:"user,omitempty" json:"user,omitempty"`
}
type JsonWrapper struct {
@@ -79,3 +80,23 @@ type Directory struct {
Id string `xml:"id,attr" json:"id"`
Name string `xml:"name,attr" json:"name"`
}
+
+type User struct {
+ Username string `xml:"username,attr" json:"username"`
+ Email string `xml:"email,attr,omitempty" json:"email,omitempty"`
+ ScrobblingEnabled bool `xml:"scrobblingEnabled,attr" json:"scrobblingEnabled"`
+ MaxBitRate int `xml:"maxBitRate,attr,omitempty" json:"maxBitRate,omitempty"`
+ AdminRole bool `xml:"adminRole,attr" json:"adminRole"`
+ SettingsRole bool `xml:"settingsRole,attr" json:"settingsRole"`
+ DownloadRole bool `xml:"downloadRole,attr" json:"downloadRole"`
+ UploadRole bool `xml:"uploadRole,attr" json:"uploadRole"`
+ PlaylistRole bool `xml:"playlistRole,attr" json:"playlistRole"`
+ CoverArtRole bool `xml:"coverArtRole,attr" json:"coverArtRole"`
+ CommentRole bool `xml:"commentRole,attr" json:"commentRole"`
+ PodcastRole bool `xml:"podcastRole,attr" json:"podcastRole"`
+ StreamRole bool `xml:"streamRole,attr" json:"streamRole"`
+ JukeboxRole bool `xml:"jukeboxRole,attr" json:"jukeboxRole"`
+ ShareRole bool `xml:"shareRole,attr" json:"shareRole"`
+ VideoConversionRole bool `xml:"videoConversionRole,attr" json:"videoConversionRole"`
+ Folder []int `xml:"folder,omitempty" json:"folder,omitempty"`
+}
diff --git a/api/responses/responses_test.go b/api/responses/responses_test.go
index 1aa733c79..7e4e4abd3 100644
--- a/api/responses/responses_test.go
+++ b/api/responses/responses_test.go
@@ -124,6 +124,28 @@ func TestSubsonicResponses(t *testing.T) {
})
})
+ Convey("User", func() {
+ response.User = &User{Username: "deluan"}
+ Convey("Without optional fields", func() {
+ Convey("XML", func() {
+ So(response, ShouldMatchXML, ``)
+ })
+ Convey("JSON", func() {
+ So(response, ShouldMatchJSON, `{"status":"ok","user":{"adminRole":false,"commentRole":false,"coverArtRole":false,"downloadRole":false,"jukeboxRole":false,"playlistRole":false,"podcastRole":false,"scrobblingEnabled":false,"settingsRole":false,"shareRole":false,"streamRole":false,"uploadRole":false,"username":"deluan","videoConversionRole":false},"version":"1.0.0"}`)
+ })
+ })
+ Convey("With optional fields", func() {
+ response.User.Email = "gosonic@deluan.com"
+ response.User.Folder = []int{1}
+ Convey("XML", func() {
+ So(response, ShouldMatchXML, `1`)
+ })
+ Convey("JSON", func() {
+ So(response, ShouldMatchJSON, `{"status":"ok","user":{"adminRole":false,"commentRole":false,"coverArtRole":false,"downloadRole":false,"email":"gosonic@deluan.com","folder":[1],"jukeboxRole":false,"playlistRole":false,"podcastRole":false,"scrobblingEnabled":false,"settingsRole":false,"shareRole":false,"streamRole":false,"uploadRole":false,"username":"deluan","videoConversionRole":false},"version":"1.0.0"}`)
+ })
+ })
+ })
+
Reset(func() {
response = &Subsonic{Status: "ok", Version: "1.0.0"}
})
diff --git a/api/users.go b/api/users.go
new file mode 100644
index 000000000..df3d647db
--- /dev/null
+++ b/api/users.go
@@ -0,0 +1,16 @@
+package api
+
+import "github.com/deluan/gosonic/api/responses"
+
+type UsersController struct{ BaseAPIController }
+
+// TODO This is a placeholder. The real one has to read this info from a config file
+func (c *UsersController) GetUser() {
+ r := c.NewEmpty()
+ r.User = &responses.User{}
+ r.User.Username = c.GetParameter("username", "Required string parameter 'username' is not present")
+ r.User.StreamRole = true
+ r.User.DownloadRole = true
+ c.SendResponse(r)
+}
+
diff --git a/conf/router.go b/conf/router.go
index 9aa10f452..f5c93fe15 100644
--- a/conf/router.go
+++ b/conf/router.go
@@ -24,6 +24,7 @@ func mapEndpoints() {
beego.NSRouter("/getCoverArt.view", &api.GetCoverArtController{}, "*:Get"),
beego.NSRouter("/stream.view", &api.StreamController{}, "*:Get"),
beego.NSRouter("/download.view", &api.StreamController{}, "*:Get"),
+ beego.NSRouter("/getUser.view", &api.UsersController{}, "*:GetUser"),
)
beego.AddNamespace(ns)