item.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package googlereader // import "miniflux.app/v2/internal/googlereader"
  4. import (
  5. "errors"
  6. "fmt"
  7. "net/http"
  8. "strconv"
  9. "strings"
  10. )
  11. const (
  12. ItemIDPrefix = "tag:google.com,2005:reader/item/"
  13. )
  14. func convertEntryIDToLongFormItemID(entryID int64) string {
  15. // The entry ID is a 64-bit integer, so we need to format it as a 16-character hexadecimal string.
  16. return ItemIDPrefix + fmt.Sprintf("%016x", entryID)
  17. }
  18. // parseItemID parses a Google Reader ID string.
  19. // It supports both the long form (tag:google.com,2005:reader/item/<hex_id>) and the short form (<decimal_id>).
  20. // It returns the parsed ID as a int64 and an error if parsing fails.
  21. func parseItemID(itemIDValue string) (int64, error) {
  22. if strings.HasPrefix(itemIDValue, ItemIDPrefix) {
  23. hexID := strings.TrimPrefix(itemIDValue, ItemIDPrefix)
  24. // It's always 16 characters wide.
  25. if len(hexID) != 16 {
  26. return 0, errors.New("long form ID has incorrect length")
  27. }
  28. parsedID, err := strconv.ParseInt(hexID, 16, 64)
  29. if err != nil {
  30. return 0, errors.New("failed to parse long form hex ID: " + err.Error())
  31. }
  32. return parsedID, nil
  33. } else {
  34. parsedID, err := strconv.ParseInt(itemIDValue, 10, 64)
  35. if err != nil {
  36. return 0, errors.New("failed to parse short form decimal ID: " + err.Error())
  37. }
  38. return parsedID, nil
  39. }
  40. }
  41. func parseItemIDsFromRequest(r *http.Request) ([]int64, error) {
  42. items := r.Form[ParamItemIDs]
  43. if len(items) == 0 {
  44. return nil, fmt.Errorf("googlereader: no items requested")
  45. }
  46. itemIDs := make([]int64, len(items))
  47. for i, item := range items {
  48. itemID, err := parseItemID(item)
  49. if err != nil {
  50. return nil, fmt.Errorf("googlereader: failed to parse item ID %s: %w", item, err)
  51. }
  52. itemIDs[i] = itemID
  53. }
  54. return itemIDs, nil
  55. }