~netlandish/links

1c53f1581dbfc589918099975cda48beca261eaa — Peter Sanchez 2 months ago 041b6fa
Removing requirement to specify visibility when adding a link.
Defaulting to org default preference.

References: https://todo.code.netlandish.com/~netlandish/links/82
M api/graph/generated.go => api/graph/generated.go +1 -1
@@ 22624,7 22624,7 @@ func (ec *executionContext) unmarshalInputLinkInput(ctx context.Context, obj int
			var err error

			ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("visibility"))
			it.Visibility, err = ec.unmarshalNInt2int(ctx, v)
			it.Visibility, err = ec.unmarshalOInt2áš–int(ctx, v)
			if err != nil {
				return it, err
			}

M api/graph/model/models_gen.go => api/graph/model/models_gen.go +1 -1
@@ 225,7 225,7 @@ type GetUserInput struct {
type LinkInput struct {
	URL         string  `json:"url"`
	Description *string `json:"description,omitempty"`
	Visibility  int     `json:"visibility"`
	Visibility  *int    `json:"visibility,omitempty"`
	Unread      bool    `json:"unread"`
	Starred     bool    `json:"starred"`
	Archive     bool    `json:"archive"`

M api/graph/schema.graphqls => api/graph/schema.graphqls +1 -1
@@ 358,7 358,7 @@ type QRObject {
input LinkInput {
    url: String!
    description: String
    visibility: Int!
    visibility: Int
    unread: Boolean!
    starred: Boolean!
    archive: Boolean!

M api/graph/schema.resolvers.go => api/graph/schema.resolvers.go +16 -7
@@ 175,11 175,13 @@ func (r *mutationResolver) AddLink(ctx context.Context, input *model.LinkInput) 

	validator := valid.New(ctx)

	validator.Expect(input.Visibility == models.OrgLinkVisibilityPublic ||
		input.Visibility == models.OrgLinkVisibilityPrivate,
		lt.Translate("Invalid Visibility value.")).
		WithField("visibility").
		WithCode(valid.ErrValidationCode)
	if input.Visibility != nil {
		validator.Expect(*input.Visibility == models.OrgLinkVisibilityPublic ||
			*input.Visibility == models.OrgLinkVisibilityPrivate,
			lt.Translate("Invalid Visibility value.")).
			WithField("visibility").
			WithCode(valid.ErrValidationCode)
	}
	_, err := url.ParseRequestURI(input.URL)
	validator.Expect(err == nil, lt.Translate("Invalid URL.")).
		WithField("url").


@@ 241,9 243,16 @@ func (r *mutationResolver) AddLink(ctx context.Context, input *model.LinkInput) 
		return nil, nil
	}

	var visibility int
	if input.Visibility == nil {
		visibility = org.Settings.DefaultPerm
	} else {
		visibility = *input.Visibility
	}

	srv := server.ForContext(ctx)
	// We want to restrict private links only to paid users
	if input.Visibility == models.OrgLinkVisibilityPrivate &&
	if visibility == models.OrgLinkVisibilityPrivate &&
		links.BillingEnabled(srv.Config) && org.IsRestricted([]int{models.BillingStatusFree}) {
		validator.Error(lt.Translate("Free organizations are not allowed to create private links. Please upgrade")).
			WithField("visibility").


@@ 270,7 279,7 @@ func (r *mutationResolver) AddLink(ctx context.Context, input *model.LinkInput) 
		Title:      input.Title,
		OrgID:      orgs[0].ID,
		BaseURLID:  sql.NullInt64{Valid: true, Int64: int64(BaseURL.ID)},
		Visibility: input.Visibility,
		Visibility: visibility,
		Unread:     input.Unread,
		Starred:    input.Starred,
		URL:        input.URL,

M models/tag_links.go => models/tag_links.go +0 -4
@@ 75,10 75,6 @@ func CreateBatchTagLinks(ctx context.Context, linkID int, tagIDs []int) error {
			PlaceholderFormat(sq.Dollar).
			RunWith(tx).
			ExecContext(ctx)

		if err != nil {
			return err
		}
		return err
	})
	return err