Skip to content

Commit

Permalink
Merge branch 'main' of github.com:svera/coreander
Browse files Browse the repository at this point in the history
  • Loading branch information
svera committed Apr 29, 2023
2 parents 38561fd + 3995de1 commit a45050a
Show file tree
Hide file tree
Showing 9 changed files with 54 additions and 24 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ Coreander can send documents through email. This way, you can take advantage of

Coreander distinguish between two kinds of users: regular users and administrator users, with the latter being the only ones with the ability to create new users.

By default, Coreander allow unrestricted access to its contents, except management areas which require and administrator user. To allow access only to registered users in the whole application, pass the `REQUIRE_AUTH=true` environment variable.
By default, Coreander allow unrestricted access to its contents, except management areas which require an administrator user. To allow access only to registered users in the whole application, pass the `REQUIRE_AUTH=true` environment variable.

On first run, Coreander creates an admin user with the following credentials:

Expand Down
6 changes: 1 addition & 5 deletions internal/controller/covers.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,7 @@ func Covers(c *fiber.Ctx, homeDir, libraryPath string, metadataReaders map[strin
image, err = metadataReaders[ext].Cover(fmt.Sprintf("%s/%s", libraryPath, fileName), coverMaxWidth)
if err != nil {
log.Println(err)
image, err = embedded.ReadFile("embedded/images/generic.jpg")
if err != nil {
log.Println(err)
return fiber.ErrInternalServerError
}
return fiber.ErrNotFound
}

c.Response().Header.Set(fiber.HeaderContentType, "image/jpeg")
Expand Down
5 changes: 5 additions & 0 deletions internal/infrastructure/template_engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"html/template"
"io/fs"
"net/http"
"strings"

"github.com/gofiber/template/html"
"golang.org/x/text/message"
Expand Down Expand Up @@ -34,5 +35,9 @@ func TemplateEngine(viewsFS fs.FS, printers map[string]*message.Printer) (*html.
return dict
})

engine.AddFunc("uppercase", func(text string) string {
return strings.ToUpper(text)
})

return engine, nil
}
3 changes: 1 addition & 2 deletions internal/webserver/embedded/translations/es.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
"Search results": "Resultados de la búsqueda"
"%d documents available": "%d documentos disponibles"
"Download": "Descargar"
"Previous": "Anterior"
"Next": "Siguiente"
"%d matches found": "Halladas %d coincidencias"
"No matches found": "No se han encontrado coincidencias"
"Title, authors, subjects, etc.": "Título, autores, temas, etc."
Expand Down Expand Up @@ -90,3 +88,4 @@
"Unknown author": "Autor/a desconocido/a"
"%d pages": "%d páginas"
"Sent from %s": "Enviado desde %s"
"\"%s\" cover": "Portada de \"%s\""
13 changes: 7 additions & 6 deletions internal/webserver/embedded/views/layout.html
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,13 @@ <h5 class="offcanvas-title" id="offcanvasNavbarLabel">Coreander</h5>
{{end}}
<hr class="d-lg-none">
{{$lang := .Lang}}
{{$pathMinusLang := .PathMinusLang}}
{{range $i, $currentLang := .SupportedLanguages}}
{{if eq $lang $currentLang}}
<li class="p-2">{{$currentLang}}</li>
{{else}}
<a class="p-2 text-dark" href="/{{$currentLang}}">{{$currentLang}}</a>
{{end}}
{{if eq $lang $currentLang}}
<li class="p-2">{{uppercase $currentLang}}</li>
{{else}}
<a class="p-2 text-dark" href="/{{$currentLang}}{{$pathMinusLang}}">{{uppercase $currentLang}}</a>
{{end}}
{{end}}
</ul>
</div>
Expand All @@ -116,4 +117,4 @@ <h5 class="offcanvas-title" id="offcanvasNavbarLabel">Coreander</h5>
<script src="/js/bootstrap.bundle.min.js"></script>
</body>

</html>
</html>
14 changes: 13 additions & 1 deletion internal/webserver/embedded/views/results.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<div class="list-group">
{{if .Results}} {{range $i, $book := .Results}}
<div class="list-group-item">
<img src="covers/{{$book.ID}}" class="border border-2 border-dark float-start me-3 2-25">
<img src="images/generic.jpg" data-src="covers/{{$book.ID}}" loading="lazy" class="border border-2 border-dark float-start me-3 2-25 cover" alt='{{t $lang "\"%s\" cover" $book.Title}}'>
<div class="row">
<div class="col-7">
{{ if ne $book.Series "" }} {{$seriesTitle := t $lang "Search for more titles belonging to %s"
Expand Down Expand Up @@ -97,4 +97,16 @@ <h5 class="text-start">{{t $lang "Unknown author"}}</h5>
console.log(error);
});
}

window.onload = function() {
let imgs = document.querySelectorAll('.cover');
for (i = 0; i < imgs.length; i++) {
if (imgs[i].getAttribute('data-src')) {
imgs[i].addEventListener('error', function onError(e) {
this.setAttribute('src', 'images/generic.jpg');
});
imgs[i].setAttribute('src', imgs[i].getAttribute('data-src'));
}
}
}
</script>
28 changes: 21 additions & 7 deletions internal/webserver/webserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,11 @@ import (
"gorm.io/gorm"
)

//go:embed embedded
var embedded embed.FS
var (
//go:embed embedded
embedded embed.FS
supportedLanguages []string
)

type Config struct {
LibraryPath string
Expand All @@ -51,7 +54,7 @@ type Sender interface {
}

// New builds a new Fiber application and set up the required routes
func New(idx controller.Reader, cfg Config, metadataReaders map[string]metadata.Reader, sender Sender, db *gorm.DB, printers map[string]*message.Printer) *fiber.App {
func New(cfg Config, printers map[string]*message.Printer) *fiber.App {
viewsFS, err := fs.Sub(embedded, "embedded/views")
if err != nil {
log.Fatal(err)
Expand All @@ -62,7 +65,7 @@ func New(idx controller.Reader, cfg Config, metadataReaders map[string]metadata.
log.Fatal(err)
}

supportedLanguages := supportedLanguages(printers)
supportedLanguages = getSupportedLanguages(printers)

app := fiber.New(fiber.Config{
Views: engine,
Expand Down Expand Up @@ -110,6 +113,11 @@ func New(idx controller.Reader, cfg Config, metadataReaders map[string]metadata.
}),
)

initResources(app)
return app
}

func initResources(app *fiber.App) {
cssFS, err := fs.Sub(embedded, "embedded/css")
if err != nil {
log.Fatal(err)
Expand All @@ -133,7 +141,9 @@ func New(idx controller.Reader, cfg Config, metadataReaders map[string]metadata.
app.Use("/images", filesystem.New(filesystem.Config{
Root: http.FS(imagesFS),
}))
}

func Routes(app *fiber.App, idx controller.Reader, cfg Config, metadataReaders map[string]metadata.Reader, sender Sender, db *gorm.DB, printers map[string]*message.Printer) {
usersRepository := &model.UserRepository{DB: db}

authCfg := controller.AuthConfig{
Expand All @@ -147,8 +157,14 @@ func New(idx controller.Reader, cfg Config, metadataReaders map[string]metadata.
authController := controller.NewAuth(usersRepository, sender, authCfg, printers)

langGroup := app.Group(fmt.Sprintf("/:lang<regex(%s)>", strings.Join(supportedLanguages, "|")), func(c *fiber.Ctx) error {
pathMinusLang := c.Path()[3:]
query := string(c.Request().URI().QueryString())
if query != "" {
pathMinusLang = pathMinusLang + "?" + query
}
c.Locals("Lang", c.Params("lang"))
c.Locals("SupportedLanguages", supportedLanguages)
c.Locals("PathMinusLang", pathMinusLang)
return c.Next()
})

Expand Down Expand Up @@ -233,11 +249,9 @@ func New(idx controller.Reader, cfg Config, metadataReaders map[string]metadata.
app.Get("/", func(c *fiber.Ctx) error {
return controller.Root(c)
})

return app
}

func supportedLanguages(printers map[string]*message.Printer) []string {
func getSupportedLanguages(printers map[string]*message.Printer) []string {
langs := make([]string, len(printers))

i := 0
Expand Down
4 changes: 3 additions & 1 deletion internal/webserver/webserver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,9 @@ func bootstrapApp(db *gorm.DB, sender webserver.Sender) *fiber.App {
log.Fatal(err)
}

return webserver.New(idx, webserverConfig, metadataReaders, sender, db, printers)
app := webserver.New(webserverConfig, printers)
webserver.Routes(app, idx, webserverConfig, metadataReaders, sender, db, printers)
return app
}

type SMTPMock struct {
Expand Down
3 changes: 2 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@ func run(cfg Config, db *gorm.DB, idx *index.BleveIndexer, homeDir string, metad
Port: cfg.Port,
SessionTimeout: sessionTimeout,
}
app := webserver.New(idx, webserverConfig, metadataReaders, sender, db, printers)
app := webserver.New(webserverConfig, printers)
webserver.Routes(app, idx, webserverConfig, metadataReaders, sender, db, printers)
fmt.Printf("Coreander version %s started listening on port %d\n\n", version, cfg.Port)
log.Fatal(app.Listen(fmt.Sprintf(":%d", cfg.Port)))
}
Expand Down

0 comments on commit a45050a

Please sign in to comment.