single user mode in server. #1

This commit is contained in:
Niko Abeler 2022-08-03 20:48:47 +02:00
parent 910e74682f
commit 52a68c1cae
3 changed files with 56 additions and 9 deletions

View File

@ -9,6 +9,18 @@ import (
"github.com/julienschmidt/httprouter" "github.com/julienschmidt/httprouter"
) )
func getUserFromRepo(repo owl.Repository, ps httprouter.Params) (owl.User, error) {
if repo.SingleUserName() != "" {
return repo.GetUser(repo.SingleUserName())
}
userName := ps.ByName("user")
user, err := repo.GetUser(userName)
if err != nil {
return owl.User{}, err
}
return user, nil
}
func repoIndexHandler(repo owl.Repository) func(http.ResponseWriter, *http.Request, httprouter.Params) { func repoIndexHandler(repo owl.Repository) func(http.ResponseWriter, *http.Request, httprouter.Params) {
return func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { return func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
html, err := owl.RenderUserList(repo) html, err := owl.RenderUserList(repo)
@ -26,8 +38,7 @@ func repoIndexHandler(repo owl.Repository) func(http.ResponseWriter, *http.Reque
func userIndexHandler(repo owl.Repository) func(http.ResponseWriter, *http.Request, httprouter.Params) { func userIndexHandler(repo owl.Repository) func(http.ResponseWriter, *http.Request, httprouter.Params) {
return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
userName := ps.ByName("user") user, err := getUserFromRepo(repo, ps)
user, err := repo.GetUser(userName)
if err != nil { if err != nil {
println("Error getting user: ", err.Error()) println("Error getting user: ", err.Error())
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
@ -41,16 +52,16 @@ func userIndexHandler(repo owl.Repository) func(http.ResponseWriter, *http.Reque
w.Write([]byte("Internal server error")) w.Write([]byte("Internal server error"))
return return
} }
println("Rendering index page for user", userName) println("Rendering index page for user", user.Name())
w.Write([]byte(html)) w.Write([]byte(html))
} }
} }
func postHandler(repo owl.Repository) func(http.ResponseWriter, *http.Request, httprouter.Params) { func postHandler(repo owl.Repository) func(http.ResponseWriter, *http.Request, httprouter.Params) {
return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
userName := ps.ByName("user")
postId := ps.ByName("post") postId := ps.ByName("post")
user, err := repo.GetUser(userName)
user, err := getUserFromRepo(repo, ps)
if err != nil { if err != nil {
println("Error getting user: ", err.Error()) println("Error getting user: ", err.Error())
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
@ -79,11 +90,10 @@ func postHandler(repo owl.Repository) func(http.ResponseWriter, *http.Request, h
func postMediaHandler(repo owl.Repository) func(http.ResponseWriter, *http.Request, httprouter.Params) { func postMediaHandler(repo owl.Repository) func(http.ResponseWriter, *http.Request, httprouter.Params) {
return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
userName := ps.ByName("user")
postId := ps.ByName("post") postId := ps.ByName("post")
filepath := ps.ByName("filepath") filepath := ps.ByName("filepath")
user, err := repo.GetUser(userName)
user, err := getUserFromRepo(repo, ps)
if err != nil { if err != nil {
println("Error getting user: ", err.Error()) println("Error getting user: ", err.Error())
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)

View File

@ -19,13 +19,24 @@ func Router(repo owl.Repository) http.Handler {
return router return router
} }
func SingleUserRouter(repo owl.Repository) http.Handler {
router := httprouter.New()
router.ServeFiles("/static/*filepath", http.Dir(repo.StaticDir()))
router.GET("/", userIndexHandler(repo))
router.GET("/posts/:post/", postHandler(repo))
router.GET("/posts/:post/media/*filepath", postMediaHandler(repo))
return router
}
func main() { func main() {
println("owl web server") println("owl web server")
println("Parameters") println("Parameters")
println("-repo <repo> - Specify the repository to use. Defaults to '.'") println("-repo <repo> - Specify the repository to use. Defaults to '.'")
println("-port <port> - Specify the port to use, Default is '8080'") println("-port <port> - Specify the port to use, Default is '8080'")
println("-user <name> - Start server in single user mode.")
var repoName string var repoName string
var port int var port int
var singleUserName string
for i, arg := range os.Args[0 : len(os.Args)-1] { for i, arg := range os.Args[0 : len(os.Args)-1] {
if arg == "-port" { if arg == "-port" {
port, _ = strconv.Atoi(os.Args[i+1]) port, _ = strconv.Atoi(os.Args[i+1])
@ -33,6 +44,9 @@ func main() {
if arg == "-repo" { if arg == "-repo" {
repoName = os.Args[i+1] repoName = os.Args[i+1]
} }
if arg == "-user" {
singleUserName = os.Args[i+1]
}
} }
if repoName == "" { if repoName == "" {
repoName = "." repoName = "."
@ -41,13 +55,32 @@ func main() {
port = 8080 port = 8080
} }
repo, err := owl.OpenRepository(repoName) var repo owl.Repository
var err error
if singleUserName != "" {
println("Single user mode")
println("Repository:", repoName)
println("User:", singleUserName)
repo, err = owl.OpenSingleUserRepo(repoName, singleUserName)
} else {
println("Multi user mode")
println("Repository:", repoName)
repo, err = owl.OpenRepository(repoName)
}
if err != nil { if err != nil {
println("Error opening repository: ", err.Error()) println("Error opening repository: ", err.Error())
os.Exit(1) os.Exit(1)
} }
router := Router(repo) var router http.Handler
if singleUserName == "" {
println("Multi user mode Router used")
router = Router(repo)
} else {
println("Single user mode Router used")
router = SingleUserRouter(repo)
}
println("Listening on port", port) println("Listening on port", port)
http.ListenAndServe(":"+strconv.Itoa(port), router) http.ListenAndServe(":"+strconv.Itoa(port), router)

View File

@ -72,6 +72,10 @@ func OpenSingleUserRepo(name string, user_name string) (Repository, error) {
return repo, nil return repo, nil
} }
func (repo Repository) SingleUserName() string {
return repo.active_user
}
func (repo Repository) Dir() string { func (repo Repository) Dir() string {
return repo.name return repo.name
} }