1const BASE_URL = '/sp_api.aspx?ref=' 2const SITIOS_ESPECIFICOS = [ 3 'Sala de Prensa' 4] 5 6const LISTAS_ESPECIFICAS = [ 7 { 8 nombre: 'Acordeon', 9 campos: [ 10 'Title', 11 'Pagina' 12 ] 13 }, 14 15 { 16 nombre: 'Normatividad', 17 campos: [ 18 'FileLeafRef', 19 'FileRef', 20 'Description', 21 'Descripcion', 22 'Descripción' 23 ] 24 }, 25 26 { 27 nombre: 'TramitesyServicios', 28 campos: [ 29 'Title', 30 'Trámite Online', 31 'Description', 32 'Descripcion', 33 'Descripción' 34 ] 35 } 36] 37 38/** 39 * Obtiene los subsitios del portal 40 * @returns {Promise<Array>} Lista de subsitios 41 */ 42 43const obtenerSubsitios = async () => { 44 const response = await fetch(BASE_URL + 'get-subsites'); 45 if (!response.ok) { 46 throw new Error('Error al obtener los subsitios'); 47 } 48 let data = await response.json(); 49 data = data.data || [] 50 return data; 51 52} 53 54const obtenerSubsitiosPrimerNivelEspecificos = (subsitios) => { 55 // Filtrar solo los subsitios de primer nivel 56 let sites = subsitios.filter(subsitio => { 57 // Cuenta la cantidad de "/" en la URL 58 // Ejemplo: "/Geoportal/" => 2 barras 59 return subsitio.Url.split('/').filter(Boolean).length === 1; 60 }); 61 62 // Agregar subsitios especÃficos 63 for (const nombre of SITIOS_ESPECIFICOS) { 64 const subsitio = obtenerSubsitioEspecifico(subsitios, nombre); 65 if (subsitio) { 66 sites.push(subsitio); 67 } 68 } 69 return sites; 70} 71 72/** 73 * Obtiene un subsitio especÃfico por su nombre 74 * Hace parte del mapeo de sitios con paginas de primer nivel y especificas 75 * @param {Array} subsitios - Lista de subsitios 76 * @param {string} nombreSubsitio - Nombre del subsitio a buscar 77 * 78 * @return {Object|null} Objeto del subsitio encontrado o null si no se encuentra 79 */ 80const obtenerSubsitioEspecifico = (subsitios, nombreSubsitio) => { 81 const subsitio = subsitios.find(s => s.Title.toLowerCase() === nombreSubsitio.toLowerCase()); 82 if (!subsitio) { 83 return null; 84 } 85 return subsitio; 86} 87 88/** 89 * Obtiene las páginas de un subsitio especÃfico 90 * Hace parte del mapeo de sitios con paginas de primer nivel y especificas 91 * @param {string} subsitio - Nombre del subsitio 92 * @return {Promise<Array>} Lista de páginas del subsitio 93 */ 94const obtenerPaginasSubsitio = async (subsitio) => { 95 const body = { 96 site: subsitio, 97 fields: [ 98 'Title', 99 'FileRef', 100 'Comments' 101 ], 102 list: 'Páginas' 103 } 104 105 const response = await fetch(BASE_URL + 'get-list-items', { 106 method: 'POST', 107 headers: { 108 'Content-Type': 'application/json' 109 }, 110 credentials: 'include', 111 body: JSON.stringify(body) 112 }); 113 if(response.url.includes("/_login/default.aspx")) { 114 return []; 115 } 116 117 if (!response.ok) { 118 throw new Error('Error al obtener las páginas del subsitio'); 119 } 120 121 let data = await response.json(); 122 data = data.data || []; 123 124 return data 125} 126 127/** 128 * 129 * @param {*} subsitio 130 * @returns 131 */ 132const obtenerPaginaPrincipalSubsitio = async (subsitio) => { 133 const body = { 134 site: subsitio, 135 fields: [ 136 'Title', 137 'FileRef' 138 ], 139 } 140 141 const response = await fetch(BASE_URL + 'get-principal-page', { 142 method: 'POST', 143 headers: { 144 'Content-Type': 'application/json' 145 }, 146 body: JSON.stringify(body) 147 }); 148 149 if(response.url.includes("/_login/default.aspx")) { 150 return null; 151 } 152 153 if (!response.ok) { 154 throw new Error('Error al obtener la página principal del subsitio'); 155 } 156 157 let data = await response.json(); 158 data = data.data || {}; 159 160 return data 161} 162 163const obtenerListas = async (subsitio) => { 164 const body = { 165 site: subsitio, 166 fields: ['Title'] 167 }; 168 169 const response = await fetch(BASE_URL + 'get-lists', { 170 method: 'POST', 171 headers: { 172 'Content-Type': 'application/json' 173 }, 174 body: JSON.stringify(body) 175 });
176 177 if(response.url.includes("/_login/default.aspx")) { 178 return []; 179 } 180 181 if (!response.ok) { 182 console.warn(`No se pudo obtener las listas del sitio "${subsitio}"`); 183 return []; 184 } 185 186 const data = await response.json(); 187 return data.data || []; 188}; 189 190/** 191 * Consulta solo listas especÃficas enviadas en el body 192 * @param {string} subsitio - URL del subsitio 193 * @param {Array<string>} nombresListas - Nombres de las listas a consultar 194 * @returns {Promise<Array>} Datos de las listas especÃficas 195 */ 196 197const obtenerElementosLista = async (subsitio, lista, campos) => { 198 const body = { 199 site: subsitio, 200 list: lista, 201 fields: campos 202 }; 203 204 const response = await fetch(BASE_URL + 'get-list-items', { 205 method: 'POST', 206 headers: { 207 'Content-Type': 'application/json' 208 }, 209 body: JSON.stringify(body) 210 }); 211 212 if(response.url.includes("/_login/default.aspx")) { 213 return []; 214 } 215 216 if (!response.ok) { 217 console.warn(`No se pudieron obtener las listas especÃficas del sitio "${subsitio}"`); 218 return []; 219 } 220 221 const data = await response.json(); 222 return data.data || []; 223}; 224 225 226export const api = { 227 obtenerSubsitios, 228 obtenerPaginasSubsitio, 229 obtenerSubsitiosPrimerNivelEspecificos, 230 obtenerPaginaPrincipalSubsitio, 231 obtenerListas, 232 obtenerElementosLista, 233 LISTAS_ESPECIFICAS 234}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.