Apply image on mesh surface
You can complete your code with the following, considering mat.use_nodes = True creates automatically a principled BSDF node.

import bpy

def add_texture(texture_path, obj):
    mat = bpy.data.materials.new(name='texture')
    mat.use_nodes = True
    nodes = mat.node_tree.nodes

    texImage = nodes.new('ShaderNodeTexImage')
    texImage.image = bpy.data.images.load(texture_path)

    principled = nodes['Principled BSDF']

    # What to link here?
    # mat.node_tree.links.new()
    mat.node_tree.links.new( texImage.outputs[0], principled.inputs[0] )

    # Assign it to object
    if obj.data.materials:
        obj.data.materials[0] = mat
    else:
        obj.data.materials.append(mat)

obj = bpy.context.object

add_texture( "your path to texture file", obj )