Skip to content

Commit

Permalink
First implementation of offline PWA
Browse files Browse the repository at this point in the history
  • Loading branch information
BhasherBEL committed Jun 21, 2024
1 parent 3ef2522 commit a308af4
Show file tree
Hide file tree
Showing 10 changed files with 718 additions and 590 deletions.
5 changes: 5 additions & 0 deletions internal/database/migrations.go
Original file line number Diff line number Diff line change
Expand Up @@ -903,4 +903,9 @@ var migrations = []func(tx *sql.Tx) error{
_, err = tx.Exec(sql)
return err
},
func(tx *sql.Tx) (err error) {
sql := `ALTER TABLE users ADD COLUMN cache_for_offline boolean default 'f'`
_, err = tx.Exec(sql)
return err
},
}
1 change: 1 addition & 0 deletions internal/locale/translations/en_US.json
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,7 @@
"form.prefs.label.default_home_page": "Default home page",
"form.prefs.label.categories_sorting_order": "Categories sorting",
"form.prefs.label.mark_read_on_view": "Automatically mark entries as read when viewed",
"form.prefs.label.cache_for_offline": "Cache entries for offline reading",
"form.prefs.fieldset.application_settings": "Application Settings",
"form.prefs.fieldset.authentication_settings": "Authentication Settings",
"form.prefs.fieldset.reader_settings": "Reader Settings",
Expand Down
6 changes: 6 additions & 0 deletions internal/model/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ type User struct {
CategoriesSortingOrder string `json:"categories_sorting_order"`
MarkReadOnView bool `json:"mark_read_on_view"`
MediaPlaybackRate float64 `json:"media_playback_rate"`
CacheForOffline bool `json:"cache_for_offline"`
}

// UserCreationRequest represents the request to create a user.
Expand Down Expand Up @@ -72,6 +73,7 @@ type UserModificationRequest struct {
CategoriesSortingOrder *string `json:"categories_sorting_order"`
MarkReadOnView *bool `json:"mark_read_on_view"`
MediaPlaybackRate *float64 `json:"media_playback_rate"`
CacheForOffline bool `json:"cache_for_offline"`
}

// Patch updates the User object with the modification request.
Expand Down Expand Up @@ -167,6 +169,10 @@ func (u *UserModificationRequest) Patch(user *User) {
if u.MediaPlaybackRate != nil {
user.MediaPlaybackRate = *u.MediaPlaybackRate
}

if u.CacheForOffline {
user.CacheForOffline = u.CacheForOffline
}
}

// UseTimezone converts last login date to the given timezone.
Expand Down
33 changes: 23 additions & 10 deletions internal/storage/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ func (s *Storage) CreateUser(userCreationRequest *model.UserCreationRequest) (*m
default_home_page,
categories_sorting_order,
mark_read_on_view,
media_playback_rate
media_playback_rate,
cache_for_offline
`

tx, err := s.db.Begin()
Expand Down Expand Up @@ -132,6 +133,7 @@ func (s *Storage) CreateUser(userCreationRequest *model.UserCreationRequest) (*m
&user.CategoriesSortingOrder,
&user.MarkReadOnView,
&user.MediaPlaybackRate,
&user.CacheForOffline,
)
if err != nil {
tx.Rollback()
Expand Down Expand Up @@ -189,9 +191,10 @@ func (s *Storage) UpdateUser(user *model.User) error {
default_home_page=$20,
categories_sorting_order=$21,
mark_read_on_view=$22,
media_playback_rate=$23
media_playback_rate=$23,
cache_for_offline=$24
WHERE
id=$24
id=$25
`

_, err = s.db.Exec(
Expand Down Expand Up @@ -219,6 +222,7 @@ func (s *Storage) UpdateUser(user *model.User) error {
user.CategoriesSortingOrder,
user.MarkReadOnView,
user.MediaPlaybackRate,
user.CacheForOffline,
user.ID,
)
if err != nil {
Expand Down Expand Up @@ -248,9 +252,10 @@ func (s *Storage) UpdateUser(user *model.User) error {
default_home_page=$19,
categories_sorting_order=$20,
mark_read_on_view=$21,
media_playback_rate=$22
media_playback_rate=$22,
cache_for_offline=$23
WHERE
id=$23
id=$24
`

_, err := s.db.Exec(
Expand All @@ -277,6 +282,7 @@ func (s *Storage) UpdateUser(user *model.User) error {
user.CategoriesSortingOrder,
user.MarkReadOnView,
user.MediaPlaybackRate,
user.CacheForOffline,
user.ID,
)

Expand Down Expand Up @@ -325,7 +331,8 @@ func (s *Storage) UserByID(userID int64) (*model.User, error) {
default_home_page,
categories_sorting_order,
mark_read_on_view,
media_playback_rate
media_playback_rate,
cache_for_offline
FROM
users
WHERE
Expand Down Expand Up @@ -361,7 +368,8 @@ func (s *Storage) UserByUsername(username string) (*model.User, error) {
default_home_page,
categories_sorting_order,
mark_read_on_view,
media_playback_rate
media_playback_rate,
cache_for_offline
FROM
users
WHERE
Expand Down Expand Up @@ -397,7 +405,8 @@ func (s *Storage) UserByField(field, value string) (*model.User, error) {
default_home_page,
categories_sorting_order,
mark_read_on_view,
media_playback_rate
media_playback_rate,
cache_for_offline
FROM
users
WHERE
Expand Down Expand Up @@ -440,7 +449,8 @@ func (s *Storage) UserByAPIKey(token string) (*model.User, error) {
u.default_home_page,
u.categories_sorting_order,
u.mark_read_on_view,
media_playback_rate
media_playback_rate,
u.cache_for_offline
FROM
users u
LEFT JOIN
Expand Down Expand Up @@ -478,6 +488,7 @@ func (s *Storage) fetchUser(query string, args ...interface{}) (*model.User, err
&user.CategoriesSortingOrder,
&user.MarkReadOnView,
&user.MediaPlaybackRate,
&user.CacheForOffline,
)

if err == sql.ErrNoRows {
Expand Down Expand Up @@ -586,7 +597,8 @@ func (s *Storage) Users() (model.Users, error) {
default_home_page,
categories_sorting_order,
mark_read_on_view,
media_playback_rate
media_playback_rate,
cache_for_offline
FROM
users
ORDER BY username ASC
Expand Down Expand Up @@ -625,6 +637,7 @@ func (s *Storage) Users() (model.Users, error) {
&user.CategoriesSortingOrder,
&user.MarkReadOnView,
&user.MediaPlaybackRate,
&user.CacheForOffline,
)

if err != nil {
Expand Down
1 change: 1 addition & 0 deletions internal/template/templates/views/settings.html
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ <h1 id="page-header-title">{{ t "page.settings.title" }}</h1>
<label><input type="checkbox" name="show_reading_time" value="1" {{ if .form.ShowReadingTime }}checked{{ end }}> {{ t "form.prefs.label.show_reading_time" }}</label>

<label><input type="checkbox" name="mark_read_on_view" value="1" {{ if .form.MarkReadOnView }}checked{{ end }}> {{ t "form.prefs.label.mark_read_on_view" }}</label>
<label><input type="checkbox" name="cache_for_offline" value="1" {{ if .form.CacheForOffline }}checked{{ end }}> {{ t "form.prefs.label.cache_for_offline" }}</label>

<div class="buttons">
<button type="submit" class="button button-primary" data-label-loading="{{ t "form.submit.saving" }}">{{ t "action.update" }}</button>
Expand Down
3 changes: 3 additions & 0 deletions internal/ui/form/settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ type SettingsForm struct {
CategoriesSortingOrder string
MarkReadOnView bool
MediaPlaybackRate float64
CacheForOffline bool
}

// Merge updates the fields of the given user.
Expand All @@ -57,6 +58,7 @@ func (s *SettingsForm) Merge(user *model.User) *model.User {
user.CategoriesSortingOrder = s.CategoriesSortingOrder
user.MarkReadOnView = s.MarkReadOnView
user.MediaPlaybackRate = s.MediaPlaybackRate
user.CacheForOffline = s.CacheForOffline

if s.Password != "" {
user.Password = s.Password
Expand Down Expand Up @@ -133,5 +135,6 @@ func NewSettingsForm(r *http.Request) *SettingsForm {
CategoriesSortingOrder: r.FormValue("categories_sorting_order"),
MarkReadOnView: r.FormValue("mark_read_on_view") == "1",
MediaPlaybackRate: mediaPlaybackRate,
CacheForOffline: r.FormValue("cache_for_offline") == "1",
}
}
1 change: 1 addition & 0 deletions internal/ui/settings_show.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ func (h *handler) showSettingsPage(w http.ResponseWriter, r *http.Request) {
CategoriesSortingOrder: user.CategoriesSortingOrder,
MarkReadOnView: user.MarkReadOnView,
MediaPlaybackRate: user.MediaPlaybackRate,
CacheForOffline: user.CacheForOffline,
}

timezones, err := h.store.Timezones()
Expand Down
Loading

0 comments on commit a308af4

Please sign in to comment.