Class: Factorix::API::MODPortalAPI

Inherits:
Object
  • Object
show all
Defined in:
lib/factorix/api/mod_portal_api.rb

Overview

API client for retrieving MOD list and details without authentication

Corresponds to: wiki.factorio.com/Mod_portal_API

Instance Method Summary collapse

Instance Method Details

#get_mod(name) ⇒ Hash{Symbol => untyped}

Retrieve basic information for a specific MOD

Parameters:

  • name (String)

    MOD name

Returns:

  • (Hash{Symbol => untyped})

    parsed JSON response with MOD metadata and releases

Raises:



54
55
56
57
58
59
60
61
# File 'lib/factorix/api/mod_portal_api.rb', line 54

def get_mod(name)
  logger.debug "Fetching MOD: name=#{name}"
  encoded_name = ERB::Util.url_encode(name)
  uri = build_uri("/api/mods/#{encoded_name}")
  fetch_with_cache(uri)
rescue HTTPNotFoundError
  raise MODNotOnPortalError, "MOD '#{name}' not found on portal"
end

#get_mod_full(name) ⇒ Hash{Symbol => untyped}

Retrieve detailed information for a specific MOD

Parameters:

  • name (String)

    MOD name

Returns:

  • (Hash{Symbol => untyped})

    parsed JSON response with full MOD details including dependencies

Raises:



68
69
70
71
72
73
74
75
# File 'lib/factorix/api/mod_portal_api.rb', line 68

def get_mod_full(name)
  logger.debug "Fetching full MOD info: name=#{name}"
  encoded_name = ERB::Util.url_encode(name)
  uri = build_uri("/api/mods/#{encoded_name}/full")
  fetch_with_cache(uri)
rescue HTTPNotFoundError
  raise MODNotOnPortalError, "MOD '#{name}' not found on portal"
end

#get_mods(*namelist, hide_deprecated: nil, page: nil, page_size: nil, sort: nil, sort_order: nil, version: nil) ⇒ Hash{Symbol => untyped}

Retrieve MOD list with optional filters

Parameters:

  • namelist (Array<String>)

    MOD names to filter (positional arguments, sorted for cache consistency)

  • hide_deprecated (Boolean, nil) (defaults to: nil)

    hide deprecated MODs

  • page (Integer, nil) (defaults to: nil)

    page number (1-based)

  • page_size (Integer, String, nil) (defaults to: nil)

    number of results per page (positive integer or “max”)

  • sort (String, nil) (defaults to: nil)

    sort field (name, created_at, updated_at)

  • sort_order (String, nil) (defaults to: nil)

    sort order (asc, desc)

  • version (String, nil) (defaults to: nil)

    Factorio version filter

Returns:

  • (Hash{Symbol => untyped})

    parsed JSON response with :results and :pagination keys



35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/factorix/api/mod_portal_api.rb', line 35

def get_mods(*namelist, hide_deprecated: nil, page: nil, page_size: nil, sort: nil, sort_order: nil, version: nil)
  validate_page_size!(page_size) if page_size
  validate_sort!(sort) if sort
  validate_sort_order!(sort_order) if sort_order
  validate_version!(version) if version

  params = {namelist: namelist.sort, hide_deprecated:, page:, page_size:, sort:, sort_order:, version:}
  params.reject! {|_k, v| v.is_a?(Array) && v.empty? }
  params.compact!
  logger.debug "Fetching MOD list: params=#{params.inspect}"
  uri = build_uri("/api/mods", **params)
  fetch_with_cache(uri)
end

#on_mod_changed(event) ⇒ void

This method returns an undefined value.

Event handler for mod.changed event Invalidates cached MOD information when a MOD is modified on the portal

Parameters:

  • event (Dry::Events::Event)

    event with mod payload



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/factorix/api/mod_portal_api.rb', line 82

def on_mod_changed(event)
  mod_name = event[:mod]
  encoded_name = ERB::Util.url_encode(mod_name)

  # Invalidate get_mod cache
  mod_uri = build_uri("/api/mods/#{encoded_name}")
  mod_cache_key = mod_uri.to_s
  cache.with_lock(mod_cache_key) { cache.delete(mod_cache_key) }

  # Invalidate get_mod_full cache
  full_uri = build_uri("/api/mods/#{encoded_name}/full")
  full_cache_key = full_uri.to_s
  cache.with_lock(full_cache_key) { cache.delete(full_cache_key) }

  logger.debug("Invalidated cache for MOD", mod: mod_name)
end