Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[pull] master from thomiceli:master #3

Merged
merged 2 commits into from
May 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/workflows/go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,12 @@ jobs:
with:
go-version: "1.22"

- name: Check
- name: Check Go modules
run: make go_mod check_changes

- name: Check translations
run: make check-tr

test:
strategy:
fail-fast: false
Expand Down
5 changes: 4 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: all all_crosscompile install build_frontend build_backend build build_crosscompile build_docker build_dev_docker run_dev_docker watch_frontend watch_backend watch clean clean_docker check_changes go_mod fmt test
.PHONY: all all_crosscompile install build_frontend build_backend build build_crosscompile build_docker build_dev_docker run_dev_docker watch_frontend watch_backend watch clean clean_docker check_changes go_mod fmt test check-tr

# Specify the name of your Go binary output
BINARY_NAME := opengist
Expand Down Expand Up @@ -73,3 +73,6 @@ fmt:

test:
@go test ./... -p 1

check-tr:
@bash ./scripts/check-translations.sh
18 changes: 11 additions & 7 deletions internal/db/gist.go
Original file line number Diff line number Diff line change
Expand Up @@ -538,13 +538,17 @@ func (gist *Gist) GetLanguagesFromFiles() ([]string, error) {
// -- DTO -- //

type GistDTO struct {
Title string `validate:"max=250" form:"title"`
Description string `validate:"max=1000" form:"description"`
URL string `validate:"max=32,alphanumdashorempty" form:"url"`
Private Visibility `validate:"number,min=0,max=2" form:"private"`
Files []FileDTO `validate:"min=1,dive"`
Name []string `form:"name"`
Content []string `form:"content"`
Title string `validate:"max=250" form:"title"`
Description string `validate:"max=1000" form:"description"`
URL string `validate:"max=32,alphanumdashorempty" form:"url"`
Files []FileDTO `validate:"min=1,dive"`
Name []string `form:"name"`
Content []string `form:"content"`
VisibilityDTO
}

type VisibilityDTO struct {
Private Visibility `validate:"number,min=0,max=2" form:"private"`
}

type FileDTO struct {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,6 @@ auth.username: 'Benutzername'
auth.password: 'Passwort'
auth.register-instead: 'Stattdessen registrieren'
auth.login-instead: 'Stattdessen anmelden'
auth.github-oauth: 'Mit GitHub-Account fortfahren'
auth.gitlab-oauth: 'Mit GitLab-Account fortfahren'
auth.gitea-oauth: 'Mit Gitea-Account fortfahren'

error: 'Fehler'

Expand Down
1 change: 0 additions & 1 deletion internal/i18n/locales/es-ES.yml
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,6 @@ admin.delete: Eliminar
admin.created_at: Creado

admin.config-link: Esta configuración puede ser %s por un archivo de configuración YAML y/o variables de entorno.
admin.config-link-overridden: sobrescrito
admin.disable-signup: Deshabilitar registro
admin.disable-signup_help: Prohibir la creación de nuevas cuentas.
admin.require-login: Requerir inicio de sesión
Expand Down
1 change: 0 additions & 1 deletion internal/i18n/locales/fr-FR.yml
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,6 @@ settings.create-password-help: Créer un mot de passe pour se connecter à Openg
settings.change-password: Changer le mot de passe
settings.change-password-help: Changer le mot de passe pour se connecter à Opengist via HTTP
settings.password-label-title: Mot de passe
auth.gitlab-oauth: Continuer avec un compte GitLab
admin.actions.sync-previews: Synchroniser l'aperçu des gists
admin.actions.reset-hooks: Réinitialiser les hooks de Git pour tous les dépôts
gist.new.url: URL
Expand Down
3 changes: 0 additions & 3 deletions internal/i18n/locales/pt-BR.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ gist.header.clone-http: Clonar via %s
gist.header.clone-http-help: Clonar com Git usando autenticação básica HTTP.
gist.header.clone-ssh: Clonar via SSH
gist.header.clone-ssh-help: Clonar com Git usando uma chave SSH.
gist.header.share: Compartilhar
gist.header.share-help: Copiar link para compartilhar este gist.
gist.header.download-zip: Baixar ZIP

gist.raw: Bruto
Expand Down Expand Up @@ -157,7 +155,6 @@ admin.delete: Excluir
admin.created_at: Criado

admin.config-link: Esta configuração pode ser %s por um arquivo de configuração YAML e/ou variáveis de ambiente.
admin.config-link-overridden: sobrescrito
admin.disable-signup: Desabilitar registro
admin.disable-signup_help: Proibir a criação de novas contas.
admin.require-login: Exigir login
Expand Down
23 changes: 14 additions & 9 deletions internal/web/gist.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,6 @@ import (
"bytes"
"errors"
"fmt"
"github.com/rs/zerolog/log"
"github.com/thomiceli/opengist/internal/git"
"github.com/thomiceli/opengist/internal/i18n"
"github.com/thomiceli/opengist/internal/index"
"github.com/thomiceli/opengist/internal/render"
"github.com/thomiceli/opengist/internal/utils"
"html/template"
"net/url"
"path/filepath"
Expand All @@ -20,6 +14,13 @@ import (
"strings"
"time"

"github.com/rs/zerolog/log"
"github.com/thomiceli/opengist/internal/git"
"github.com/thomiceli/opengist/internal/i18n"
"github.com/thomiceli/opengist/internal/index"
"github.com/thomiceli/opengist/internal/render"
"github.com/thomiceli/opengist/internal/utils"

"github.com/google/uuid"
"github.com/labstack/echo/v4"
"github.com/thomiceli/opengist/internal/config"
Expand Down Expand Up @@ -603,10 +604,15 @@ func processCreate(ctx echo.Context) error {
return redirect(ctx, "/"+user.Username+"/"+gist.Identifier())
}

func toggleVisibility(ctx echo.Context) error {
func editVisibility(ctx echo.Context) error {
gist := getData(ctx, "gist").(*db.Gist)

gist.Private = (gist.Private + 1) % 3
dto := new(db.VisibilityDTO)
if err := ctx.Bind(dto); err != nil {
return errorRes(400, tr(ctx, "error.cannot-bind-data"), err)
}

gist.Private = dto.Private
if err := gist.UpdateNoTimestamps(); err != nil {
return errorRes(500, "Error updating this gist", err)
}
Expand Down Expand Up @@ -733,7 +739,6 @@ func downloadFile(ctx echo.Context) error {
ctx.Response().Header().Set("Content-Disposition", "attachment; filename="+file.Filename)
ctx.Response().Header().Set("Content-Length", strconv.Itoa(len(file.Content)))
_, err = ctx.Response().Write([]byte(file.Content))

if err != nil {
return errorRes(500, "Error downloading the file", err)
}
Expand Down
9 changes: 5 additions & 4 deletions internal/web/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/thomiceli/opengist/internal/index"
"github.com/thomiceli/opengist/internal/utils"
"github.com/thomiceli/opengist/templates"
htmlpkg "html"
"html/template"
"io"
Expand All @@ -21,6 +18,10 @@ import (
"strings"
"time"

"github.com/thomiceli/opengist/internal/index"
"github.com/thomiceli/opengist/internal/utils"
"github.com/thomiceli/opengist/templates"

"github.com/gorilla/sessions"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
Expand Down Expand Up @@ -313,7 +314,7 @@ func NewServer(isDev bool) *Server {
g3.GET("/rev/:revision", gistIndex)
g3.GET("/revisions", revisions)
g3.GET("/archive/:revision", downloadZip)
g3.POST("/visibility", toggleVisibility, logged, writePermission)
g3.POST("/visibility", editVisibility, logged, writePermission)
g3.POST("/delete", deleteGist, logged, writePermission)
g3.GET("/raw/:revision/:file", rawFile)
g3.GET("/download/:revision/:file", downloadFile)
Expand Down
65 changes: 40 additions & 25 deletions internal/web/test/gist_test.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package test

import (
"testing"

"github.com/stretchr/testify/require"
"github.com/thomiceli/opengist/internal/db"
"github.com/thomiceli/opengist/internal/git"
"testing"
)

func TestGists(t *testing.T) {
Expand All @@ -28,9 +29,11 @@ func TestGists(t *testing.T) {
gist1 := db.GistDTO{
Title: "gist1",
Description: "my first gist",
Private: 0,
Name: []string{"gist1.txt", "gist2.txt", "gist3.txt"},
Content: []string{"yeah", "yeah\ncool", "yeah\ncool gist actually"},
VisibilityDTO: db.VisibilityDTO{
Private: 0,
},
Name: []string{"gist1.txt", "gist2.txt", "gist3.txt"},
Content: []string{"yeah", "yeah\ncool", "yeah\ncool gist actually"},
}
err = s.request("POST", "/", gist1, 302)
require.NoError(t, err)
Expand All @@ -57,19 +60,23 @@ func TestGists(t *testing.T) {
gist2 := db.GistDTO{
Title: "gist2",
Description: "my second gist",
Private: 0,
Name: []string{"", "gist2.txt", "gist3.txt"},
Content: []string{"", "yeah\ncool", "yeah\ncool gist actually"},
VisibilityDTO: db.VisibilityDTO{
Private: 0,
},
Name: []string{"", "gist2.txt", "gist3.txt"},
Content: []string{"", "yeah\ncool", "yeah\ncool gist actually"},
}
err = s.request("POST", "/", gist2, 200)
require.NoError(t, err)

gist3 := db.GistDTO{
Title: "gist3",
Description: "my third gist",
Private: 0,
Name: []string{""},
Content: []string{"yeah"},
VisibilityDTO: db.VisibilityDTO{
Private: 0,
},
Name: []string{""},
Content: []string{"yeah"},
}
err = s.request("POST", "/", gist3, 302)
require.NoError(t, err)
Expand Down Expand Up @@ -110,9 +117,11 @@ func TestVisibility(t *testing.T) {
gist1 := db.GistDTO{
Title: "gist1",
Description: "my first gist",
Private: db.UnlistedVisibility,
Name: []string{""},
Content: []string{"yeah"},
VisibilityDTO: db.VisibilityDTO{
Private: db.UnlistedVisibility,
},
Name: []string{""},
Content: []string{"yeah"},
}
err = s.request("POST", "/", gist1, 302)
require.NoError(t, err)
Expand All @@ -121,19 +130,19 @@ func TestVisibility(t *testing.T) {
require.NoError(t, err)
require.Equal(t, db.UnlistedVisibility, gist1db.Private)

err = s.request("POST", "/"+gist1db.User.Username+"/"+gist1db.Uuid+"/visibility", nil, 302)
err = s.request("POST", "/"+gist1db.User.Username+"/"+gist1db.Uuid+"/visibility", db.VisibilityDTO{Private: db.PrivateVisibility}, 302)
require.NoError(t, err)
gist1db, err = db.GetGistByID("1")
require.NoError(t, err)
require.Equal(t, db.PrivateVisibility, gist1db.Private)

err = s.request("POST", "/"+gist1db.User.Username+"/"+gist1db.Uuid+"/visibility", nil, 302)
err = s.request("POST", "/"+gist1db.User.Username+"/"+gist1db.Uuid+"/visibility", db.VisibilityDTO{Private: db.PublicVisibility}, 302)
require.NoError(t, err)
gist1db, err = db.GetGistByID("1")
require.NoError(t, err)
require.Equal(t, db.PublicVisibility, gist1db.Private)

err = s.request("POST", "/"+gist1db.User.Username+"/"+gist1db.Uuid+"/visibility", nil, 302)
err = s.request("POST", "/"+gist1db.User.Username+"/"+gist1db.Uuid+"/visibility", db.VisibilityDTO{Private: db.UnlistedVisibility}, 302)
require.NoError(t, err)
gist1db, err = db.GetGistByID("1")
require.NoError(t, err)
Expand All @@ -152,9 +161,11 @@ func TestLikeFork(t *testing.T) {
gist1 := db.GistDTO{
Title: "gist1",
Description: "my first gist",
Private: 1,
Name: []string{""},
Content: []string{"yeah"},
VisibilityDTO: db.VisibilityDTO{
Private: 1,
},
Name: []string{""},
Content: []string{"yeah"},
}
err = s.request("POST", "/", gist1, 302)
require.NoError(t, err)
Expand Down Expand Up @@ -212,9 +223,11 @@ func TestCustomUrl(t *testing.T) {
Title: "gist1",
URL: "my-gist",
Description: "my first gist",
Private: 0,
Name: []string{"gist1.txt", "gist2.txt", "gist3.txt"},
Content: []string{"yeah", "yeah\ncool", "yeah\ncool gist actually"},
VisibilityDTO: db.VisibilityDTO{
Private: 0,
},
Name: []string{"gist1.txt", "gist2.txt", "gist3.txt"},
Content: []string{"yeah", "yeah\ncool", "yeah\ncool gist actually"},
}
err = s.request("POST", "/", gist1, 302)
require.NoError(t, err)
Expand All @@ -241,9 +254,11 @@ func TestCustomUrl(t *testing.T) {
gist2 := db.GistDTO{
Title: "gist2",
Description: "my second gist",
Private: 0,
Name: []string{"gist1.txt", "gist2.txt", "gist3.txt"},
Content: []string{"yeah", "yeah\ncool", "yeah\ncool gist actually"},
VisibilityDTO: db.VisibilityDTO{
Private: 0,
},
Name: []string{"gist1.txt", "gist2.txt", "gist3.txt"},
Content: []string{"yeah", "yeah\ncool", "yeah\ncool gist actually"},
}
err = s.request("POST", "/", gist2, 302)
require.NoError(t, err)
Expand Down
23 changes: 15 additions & 8 deletions internal/web/test/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,6 @@ package test
import (
"errors"
"fmt"
"github.com/rs/zerolog/log"
"github.com/stretchr/testify/require"
"github.com/thomiceli/opengist/internal/config"
"github.com/thomiceli/opengist/internal/db"
"github.com/thomiceli/opengist/internal/git"
"github.com/thomiceli/opengist/internal/memdb"
"github.com/thomiceli/opengist/internal/web"
"io"
"net/http"
"net/http/httptest"
Expand All @@ -21,6 +14,14 @@ import (
"strconv"
"strings"
"testing"

"github.com/rs/zerolog/log"
"github.com/stretchr/testify/require"
"github.com/thomiceli/opengist/internal/config"
"github.com/thomiceli/opengist/internal/db"
"github.com/thomiceli/opengist/internal/git"
"github.com/thomiceli/opengist/internal/memdb"
"github.com/thomiceli/opengist/internal/web"
)

type testServer struct {
Expand Down Expand Up @@ -106,7 +107,7 @@ func structToURLValues(s interface{}) url.Values {
for i := 0; i < rValue.NumField(); i++ {
field := rValue.Type().Field(i)
tag := field.Tag.Get("form")
if tag != "" {
if tag != "" || field.Anonymous {
if field.Type.Kind() == reflect.Int {
fieldValue := rValue.Field(i).Int()
v.Add(tag, strconv.FormatInt(fieldValue, 10))
Expand All @@ -115,6 +116,12 @@ func structToURLValues(s interface{}) url.Values {
for _, va := range fieldValue {
v.Add(tag, va)
}
} else if field.Type.Kind() == reflect.Struct {
for key, val := range structToURLValues(rValue.Field(i).Interface()) {
for _, vv := range val {
v.Add(key, vv)
}
}
} else {
fieldValue := rValue.Field(i).String()
v.Add(tag, fieldValue)
Expand Down
Loading